我一直在关注一本名为Pro ASP.net的书,并且遇到了一个相当奇怪的问题。我有一个链接到控制器的Razor视图,在该视图中我使用@Html.BeginForm()
。但是,当表单包含除提交按钮以外的任何内容时,表单不会提交。如果我只是在@Html.BeginForm
内有按钮,那么视图就会很好地转到我的控制器。但是当我把表单内容的其余部分放入其中时,当我点击提交按钮时没有任何反应。
视图中的相关HTML
@using (Html.BeginForm("EditContact", "EditContact"))
{
<div class="container">
@Html.HiddenFor(m => m.Id)
@foreach (var property in ViewData.ModelMetadata.Properties)
{
if (property.PropertyName != "Id")
{
<div class="form-group">
<label>@(property.DisplayName ?? property.PropertyName)</label>
@Html.TextBox(property.PropertyName, Model.GetPropertyValue(property.PropertyName), new {@class = "form-control"})
@Html.ValidationMessage(property.PropertyName)
</div>
}
}
<div class="row">
<div class="col-md-1">
<button type="submit" class="btn btn-primary">Save</button>
</div>
<div class="col-md-1">
@Html.ActionLink("Cancel", "Cancel", null, new {@class="btn btn-default"})
</div>
</div>
</div>
}
连接控制器
namespace ActiveCampaign.WebUI.Controllers
{
public class EditContactController : Controller
{
private IContactRepository _repository;
private ActiveApi _activeService = new ActiveApi();
public EditContactController(IContactRepository contactRepository)
{
_repository = contactRepository;
}
public ActionResult Index(Contact contact)
{
return View("EditContact", contact);
}
[HttpPost]
public ActionResult EditContact(Contact contact)
{
if (ModelState.IsValid)
{
var result = _activeService.EditContact(contact);
if (result)
{
_repository.SaveContact(contact);
return RedirectToAction("Index", "Home");
}
}
return View("EditContact", contact);
}
public ActionResult Cancel()
{
return RedirectToAction("Index", "Home");
}
}
}
答案 0 :(得分:2)
您尚未指定按钮的类型。默认类型为button
,它本身不执行任何操作。你想要的是submit
:
<button type="submit" class="btn btn-primary">Save</button>
答案 1 :(得分:0)
原来@Html.HiddenFor(...)
是罪魁祸首!为什么我不确定(特别是因为我编写的另一个使用它的应用程序工作正常),但删除它会使一切正常工作。
答案 2 :(得分:0)
我想您忘了在BeginForm中添加post方法。我认为编辑下面这样的代码可能会正常工作。并检查任何标签错位。
@using (Html.BeginForm("EditContact", "EditContact",FormMethod.Post))