2013-03-03 1 views
21

У меня есть базовая форма, для которой я хочу обрабатывать кнопки внутри формы, вызывая метод ActionResult в связанном с View объекте Controller. Вот следующий HTML5 код формы:Как связать действие формы HTML5 с методом Controller ActionResult в ASP.NET MVC 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 ... --> 

Соответствующий Controller код следующим образом:

[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(); 
} 

ответ

49

вы делаете использование HTML Helper и имеют

@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"/> 
    } 

или используйте помощник Url

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

Html.BeginForm имеет несколько (13) переопределения, где вы можете указать дополнительную информацию, например, нормальное использование, когда загрузка файлов с помощью:

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

Если вы не указали никаких аргументов, то Html.BeginForm() будет создайте форму POST, которая указывает на текущий контроллер и текущее действие. В качестве примера, скажем, у вас есть контроллер под названием Posts и действие называется Delete

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"); 
} 

и ваш HTML страница будет что-то вроде:

<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

Я попытался использовать метод 2 с помощью URL-адреса, но я думаю, что синтаксис, который я нашел, был специфичным для MVC3, и он не работал. Это прекрасно соответствовало моим потребностям. Спасибо! – dtg

+0

@Dylan: Потому что отсутствует) кронштейн в Html.BeginForm линии. – Muflix

+1

Как у вас есть «public ActionResult Delete (int id)» и «[HttpPost] public ActionResult Delete (int id)»? Разве нет конфликта имен между ними? – Alexander

0

Здесь я в основном оборачивать кнопку в ссылка. Преимущество состоит в том, что вы можете публиковать различные методы действий в одной и той же форме.

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

Добавление параметров:

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

Добавление параметров из не перечисленных Model:

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

Вы можете сделать то же самое для перечисляемого модели тоже. Вам просто нужно сначала обратиться к одному объекту. Счастливое кодирование!