我使用最新的mvc期货BeginForm扩展时遇到问题。我已经禁用了clientidevalidation,因为我已经读过它可能仍然存在错误。基本上第一次发布模型是空的,第二次(以及之后的任何时间)它将发布模型罚款。
如果我将其切换回@using(Html.BeginForm())或@using(Html.BeginForm(“action”,“controller”等),但我宁愿使用强类型版本,它也能工作。这是我的代码:
控制器
[HandleError]
public class HomeController : BaseServiceController<IUserService>
{
public HomeController(IUserService service, IMapper mapper, ICustomPrincipal user)
: base(service, mapper, user)
{}
[AllowAnonymous]
[HttpGet]
public ActionResult Logon(string ReturnUrl)
{
LogonModel model = new LogonModel() { ReturnUrl = ReturnUrl };
return View(model);
}
[AllowAnonymous]
[HttpPost]
public ActionResult Logon(LogonModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
SfUser sfUser = service.Logon(model.UserName, model.Password);
if (sfUser == null)
{
ModelState.AddModelError("General", "Username or Password incorrect");
return View(model);
}
Response.Cookies.Add(TicketMaster.setAuthCookie(new CustomPrincipalSerializeModel(sfUser)));
return Redirect(model.ReturnUrl);
}
查看
@model LogonModel
@{
ViewBag.Title = "Logon";
}
//@using(Html.BeginForm()) //Works
@using(Html.BeginForm<HomeController>(c => c.Logon(Model)))
{
@Html.HiddenFor(m => m.ReturnUrl)
<div class="editor-label">
@Html.LabelFor(m => m.UserName)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Password)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<br />
<p>
<input type="submit" value="Login" /><br />
@Html.ValidationSummary(true)
</p>
}
我能理解这个问题,如果它总是发布一个空模型,但仅限于第一篇文章?让我生气。
答案 0 :(得分:0)
我知道这已经过时了,可能已经以某种方式解决了,但你应该将null
而不是Model
传递给表达式。这样,模型将使用表单值构建。
我花了几个小时才到find this。转到Strong Typed Html BeginForm<TController>
部分。这是关键点:
您希望在表单的范围内传递值,而不是 BeginForm方法本身。
在您的情况下,只需更改
@using(Html.BeginForm<HomeController>(c => c.Logon(Model)))
到
@using(Html.BeginForm<HomeController>(c => c.Logon(null)))