2013-03-03 2 views
21

Ich habe ein Basisformular, für das ich Schaltflächen innerhalb des Formulars behandeln möchten, durch Aufruf der ActionResult-Methode in der zugeordneten Klasse Controller der Ansicht. Hier ist die folgende HTML5 Code für das Formular:HTML5-Formularaktion mit Controller ActionResult-Methode in ASP.NET MVC verbinden 4

<h2>Welcome</h2> 

<div> 

    <h3>Login</h3> 

    <form method="post" action= <!-- what goes here --> > 
     Username: <input type="text" name="username" /> <br /> 
     Password: <input type="text" name="password" /> <br /> 
     <input type="submit" value="Login"> 
     <input type="submit" value="Create Account"/> 
    </form> 

</div> 

<!-- more code ... --> 

Der entsprechende Controller Code ist der folgende:

[HttpPost] 
public ActionResult MyAction(string input, FormCollection collection) 
{ 
    switch (input) 
    { 
     case "Login": 
      // do some stuff... 
      break; 
     case "Create Account" 
      // do some other stuff... 
      break; 
    } 

    return View(); 
} 

Antwort

49

Sie die Verwendung der HTML-Helfer machen und haben

@using(Html.BeginForm()) 
    { 
     Username: <input type="text" name="username" /> <br /> 
     Password: <input type="text" name="password" /> <br /> 
     <input type="submit" value="Login"> 
     <input type="submit" value="Create Account"/> 
    } 

oder Verwenden Sie den URL-Helfer

<form method="post" action="@Url.Action("MyAction", "MyController")" > 

Html.BeginForm hat mehrere (13) überschreibt, wo Sie weitere Informationen, zum Beispiel für einen normalen Gebrauch, wenn das Hochladen von Dateien angeben können verwendet:

@using(Html.BeginForm("myaction", "mycontroller", FormMethod.Post, new {enctype = "multipart/form-data"})) 
{ 
    <...> 
} 

Wenn Sie irgendwelche Argumente nicht angeben, die Html.BeginForm() werden Erstellen Sie ein POST Formular, das zeigt auf Ihren aktuellen Controller und aktuelle Aktion. Als Beispiel sagen wir, Sie haben einen Controller Posts und eine Aktion Delete genannt

public ActionResult Delete(int id) 
{ 
    var model = db.GetPostById(id); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Delete(int id) 
{ 
    var model = db.GetPostById(id); 
    if(model != null) 
     db.DeletePost(id); 

    return RedirectToView("Index"); 
} 

und Ihre HTML-Seite würde wie sein etwas genannt:

<h2>Are you sure you want to delete?</h2> 
<p>The Post named <strong>@Model.Title</strong> will be deleted.</p> 

@using(Html.BeginForm()) 
{ 
    <input type="submit" class="btn btn-danger" value="Delete Post"/> 
    <text>or</text> 
    @Url.ActionLink("go to list", "Index") 
} 
+0

Ich versuchte Methode 2 mit dem URL-Helfer, aber ich denke, die Syntax, die ich fand, war MVC3-spezifisch und es hat nicht funktioniert. Dieser passt perfekt zu meinen Bedürfnissen. Vielen Dank! – dtg

+0

@Dylan: Weil es fehlt) Klammer in Html.BeginForm Linie. – Muflix

+1

Wie hatten Sie sowohl öffentliche ActionResult Delete (int ID) 'und' [HttpPost] öffentlichen ActionResult Delete (int ID) '? Gibt es nicht eine Namenskollision zwischen den beiden? – Alexander

0

Hier bin ich im Grunde eine Schaltfläche in eine Umhüllung Verknüpfung. Der Vorteil ist, dass Sie in derselben Form auf verschiedene Aktionsmethoden posten können.

<a href="Controller/ActionMethod"> 
    <input type="button" value="Click Me" /> 
</a> 

Hinzufügen von Parametern:

<a href="Controller/ActionMethod?userName=ted"> 
    <input type="button" value="Click Me" /> 
</a> 

Hinzufügen von Parametern aus einem nicht-aufgezählt Modell:

<a href="Controller/[email protected]"> 
    <input type="button" value="Click Me" /> 
</a> 

Sie können auch das gleiche für ein numerisches Modell tun. Sie müssten nur eine einzelne Entität referenzieren. Glückliche Kodierung!