我正在使用 ASP.net MVC 4 和 Razor 引擎。
我有一个页面(Index.cshtml)和一个控制器(HomeController.cs)
我正在尝试将我的提交按钮连接到控制器中的操作结果 - 但我似乎无法让它启动。
我的 HTML :
@using (Html.BeginForm("SubmitForm", "Home", FormMethod.Post))
{
<div class="main-Background">
******lots of other html here*******
<button type="submit" id="btnSave">Save</button>
</div>
}
我的控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
[HttpPost]
public ActionResult SubmitForm()
{
return View();
}
}
目前我还没有实现一个模型来将值传递到控制器,我只是想看看是否可以触发 ActionResult SubmitForm。
我尝试过不带参数的
@using (Html.BeginForm())
,我也尝试过在我的ActionResult上方包含[HttpPost]
,但没有任何运气。
编辑我也尝试过使用
<input type="submit" id="btnSave">Save</input>
代替按钮。
不知道我哪里错了
事实证明,jQuery 正在阻止 ActionResult 被命中。
我有一个按钮单击事件“吞噬”了 ActionResult 功能。我通过使用 Ajax 调用 ActionResult 解决了这个问题。
您不需要使用
"-Controller"
后缀。仅使用 Home
而不是 HomeController
,MVC 将为您转换它。
使用
@using (Html.BeginForm("SubmitForm", "Home", FormMethod.Post, new { id = "submitForm" }))
而不是
@using (Html.BeginForm("SubmitForm", "HomeController", FormMethod.Post, new { id = "submitForm" }))
完整代码
查看
@using (Html.BeginForm("SubmitForm", "Home", FormMethod.Post, new { id = "submitForm" }))
{
<div class="main-Background">
******lots of other html here*******
<input type="submit" id="btnSave">Save</input>
</div>
}
和控制器
[HttpPost]
public ActionResult SubmitForm()
{
return View();
}
查看:
@using (Html.BeginForm("SubmitForm", "Home", FormMethod.Post))
{
<div class="main-Background">
******lots of other html here*******
<button type="submit" id="btnSave">Save</button>
</div>
}
控制器:
[HttpPost]
public ActionResult SubmitForm()
{
return View();
}
问题可能是由于 div 中的其他 HTML 引起的,因此请检查一下。 否则它可以正常工作。
您需要添加带有参数的Html.BeginForm。这是一个例子:
ActionName – 操作的名称。在本例中,名称为“创建”。
ControllerName – 控制器的名称。在本例中,名称是 Home。
FormMethod – 它指定表单方法,即 GET 或 POST。在这种情况下,它将被设置为 POST。
http://localhost:60386//Home/Create
@using (Html.BeginForm("Create", "Home", FormMethod.Post))
{
@Html.EditorFor(model => model.FirstName)
<input type="submit" value="Create"/>
}
HomeController.cs:
[HttpPost]
public ActionResult Create(Person person)
{
if (ModelState.IsValid)
{
db.Persons.Add(person);
db.SaveChanges();
return RedirectToAction("Create");
}
return View(person);
}
TL;博士
我的视图模型上有
[Required]
数据属性,在未填写表单时阻止提交工作。
我的 MVC 代码中有 两个提交按钮,一个用于
Submit
,另一个用于 Cancel
。
两个按钮在数据输入时都能正确触发,但在没有输入任何内容时都不会正确触发。
我花了一点时间才意识到我的视图模型具有
[Required]
字段验证!
查看:
@using (Html.BeginForm(actionName: "Index", controllerName: "User", method: FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.TextBoxFor(m => m.PhoneNumber)
...
<input type="submit" name="submitAction" value="Verify" />
<input type="submit" name="submitAction" value="Cancel" />
}
视图模型:
public class UserViewModel
{
[Required]
[MaxLength(10)]
public string PhoneNumber { get; set; }
[Required]
...
}
控制器方法:
[HttpPost]
[ValidateAntiForgeryToken()]
public ActionResult Index(UserViewModel viewModel, string submitAction)
{
switch(submitAction)
{
case "Verify": ...
case "Cancel": ...
}
}
确保_Layout.cshtml中的@RenderBody()不在标签中
改变这个
@using (Html.BeginForm("SubmitForm", "HomeController", FormMethod.Post, new { id = "submitForm" }))
到
@using (Html.BeginForm("SubmitForm", "Home", FormMethod.Post, new { id = "submitForm" }))
说明:不需要在任何地方添加后缀Controller,默认接受
和在控制器
[HttpPost]
public ActionResult SubmitForm(string id)
{
return View();
}
说明:由于您给出的 Form Method 是 Post 所以需要在 Action 之前包含
[HttpPost]
并且您传递的参数在操作方法中丢失了