ASP.NET MVC中的@ Html.BeginForm问题

时间:2014-08-10 10:12:04

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我的表格看起来像这样:

@using (Html.BeginForm("Login", "Home", FormMethod.Post, new { @class = "nav-login-form" }))
{
    @Html.TextBoxFor(m => m.LoginForm.Username, new {@placeholder = "username"})
    @Html.HiddenFor(m => m.LoginForm.Username)
    @Html.PasswordFor(m => m.LoginForm.Password, new { @placeholder = "password" })
    @Html.HiddenFor(m => m.LoginForm.Password)
    <input type="submit" value="login"/>
}

但是,提交此表单时,似乎没有执行控制器方法。它有一个看起来像这样的签名:

[HttpPost]
public ActionResult Login(NavBarLogin loginForm)

我的表单处于局部视图中,其中HomepageViewModel作为模型类型。这个模型里面有一个LoginForm对象,这个表单应该发布给控制器。模型从Index视图传递到局部视图,如下所示:

@Html.Partial("_NavBarPartial", Model)

我最好猜测为什么这个表单不能正常工作是因为视图中定义的模型与表单使用的模型对象不同。但是,我不能简单地使用NavBarLogin作为模型类型,因为模型的其他部分在partial中的其他地方使用。我可以尝试进一步分解,但这是否真的需要使这个表单有效?我甚至在我的假设中是否正确?

修改: 我的论坛是这样呈现的,行动应该是空白的吗?

<form action="" class="nav-login-form" method="post">
  <input id="LoginForm_Username" name="LoginForm.Username" placeholder="username" type="text" value="" />
  <input id="LoginForm_Password" name="LoginForm.Password" placeholder="password" type="password" />
  <input type="submit" value="login"/>

1 个答案:

答案 0 :(得分:0)

您可以使用Prefix

BindAttribute属性
[HttpPost]
public ActionResult Login([Bind(Prefix="LoginForm")] NavBarLogin loginForm)

由于您的输入呈现为

<input type="text" name="LoginForm.Username" value=.../>

NavBarLogin具有属性Username(不是具有属性LogInForm的复杂属性UserName),这样做有效地从发布中剥离"LoginForm."值因此它们将正确绑定