BeginForm <controller>不会第一次发布模型</controller>

时间:2013-10-10 12:12:15

标签: asp.net-mvc razor html.beginform

我使用最新的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>
}   

我能理解这个问题,如果它总是发布一个空模型,但仅限于第一篇文章?让我生气。

1 个答案:

答案 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)))