ASP.Net MVC Übergeben von Daten aus der Ansicht an den Controller [geschlossen]

79

Ich bin völlig neu in ASP.Net und ich bin sicher, dass dies eine sehr grundlegende Frage ist. Ich habe eine Ansicht, in der es einen Link zum Generieren eines Berichts gibt. Um jedoch einen Bericht erstellen zu können, muss ich den Benutzer bitten, einen geeigneten Textnamen als anzugeben Gut.

Bisher konnte ich Daten vom Server zur Ansicht übergeben, indem ich Modelle verwendete, die von meinem Controller zur Ansicht übergeben wurden, aber ich bin nicht sicher, wie ich Daten von der Ansicht zu meinem Controller übergeben soll.

In diesem Fall muss ich nur eine Zeichenfolge aus der Ansicht an den Controller übergeben.

Jeder Rat mit Beispiel wird geschätzt.

AKTUALISIEREN

Ich verstehe, dass ich die Daten zurück auf den Server stellen muss, aber wie wird dies in Form von Razorhtml-Code und Controller realisiert?

Ahmed
quelle
Der Benutzer muss etwas posten - die Ansicht weiß nicht direkt, wie sie mit einem Controller kommunizieren soll.
Daniel A. White
Wenn Sie die Microsoft-Dokumentation lesen, werden Sie feststellen, dass darin NICHT erklärt wird, wie dies zu tun ist.
Paul McCarthy

Antworten:

130

Sie können dies mit ViewModels tun, z. B. wie Sie Daten von Ihrem Controller an die Anzeige übergeben haben.

Angenommen, Sie haben ein solches Ansichtsmodell

public class ReportViewModel
{
   public string Name { set;get;}
}

und in Ihrer GET-Aktion,

public ActionResult Report()
{
  return View(new ReportViewModel());
}

und Ihre Ansicht muss stark getippt sein ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

und in Ihrer HttpPost- Aktionsmethode in Ihrem Controller

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

ODER Sie können dies einfach ohne die POCO-Klassen (Viewmodels) tun.

@using(Html.BeginForm())
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

Verwenden Sie in Ihrer HttpPost-Aktion einen Parameter mit demselben Namen wie der Name des Textfelds.

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

EDIT: Wie im Kommentar

Wenn Sie auf einem anderen Controller posten möchten, können Sie diese Überladung der BeginForm-Methode verwenden.

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

Daten von der Aktionsmethode an die Ansicht übergeben?

Sie können dasselbe Ansichtsmodell verwenden, indem Sie einfach die Eigenschaftswerte in Ihrer GET-Aktionsmethode festlegen

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

und aus Ihrer Sicht

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}
Shyju
quelle
Gibt es in der von Ihnen vorgestellten Option / Methode 2 (ohne Modell) eine Möglichkeit, den Namen des Controllers anzugeben? weil der Controller, der diese Post-Anfrage erhalten soll, anders ist als der Controller dieser Ansicht.
Ahmed
@Ahmed: Überprüfen Sie die aktualisierte Antwort. Sie können die spezifische Überladung der BeginForm-Methode verwenden.
Shyju
4
ausgezeichnet, danke für Ihre tolle Antwort ..
Ahmed
Schön, ich habe jetzt ein paar Stunden gesucht. Vielen Dank!
Dan Beaulieu
Vielen Dank!! Sehr klare Antwort. In meinem Fall musste ich in der HttpPost-Aktion keinen Parameter mit demselben Namen wie der Textfeldname verwenden. Geben Sie nur das Modellobjekt als Parameter ein. Ich kann die Werte abrufen.
Hnin Htet Htet Aung
27

Falls Sie nicht posten möchten / müssen:

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

Beachten Sie, dass die reportID im neuen Teil {} mit der reportID in den Aktionsparametern übereinstimmt. Sie können auf diese Weise eine beliebige Anzahl von Parametern hinzufügen. Bei mehr als 2 oder 3 (einige argumentieren immer) sollten Sie ein Modell über einen POST übergeben ( wie nach anderer Antwort)

Bearbeiten : Null hinzugefügt für korrekte Überladung, wie in den Kommentaren angegeben. Es gibt eine Reihe von Überladungen. Wenn Sie beide Aktionen + Controller angeben, benötigen Sie sowohl routeValues ​​als auch htmlAttributes. Ohne den Controller (nur Beschriftung + Aktion) werden nur routeValues ​​benötigt, es kann jedoch eine bewährte Methode sein, immer beide anzugeben.

Freiheit-m
quelle
4
Nur zu Ihrer Information für alle, die auf diese einfache Antwort stoßen, fügen Sie eine Null hinzu, nachdem Sie Ihre Routenwerte [new {reportID = 1}] angegeben haben. Andernfalls wird versucht, sie als htmlAttributes zu verwenden, und sie werden nicht
durchkommen.
22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

Regler:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}
Azure-KMU
quelle
1
<input type = "valueINeed" type = "text"> sollte <input name = "valueINeed" type = "text"> sein
GregH
Danke. Antwort aktualisiert.
Azure SME