我的登录视图采用了LoginPageViewModel:
public class LoginPageViewModel : PageViewModel
{
public string ReturnUrl { get; set; }
public bool PreviousLoginFailed { get; set; }
public LoginFormViewModel EditForm { get; set; }
}
在视图中呈现。当用户尝试登录时,我只想将LoginFormViewModel(Model.EditForm)发布到控制器:
public ActionResult Login(LoginFormViewModel loginDetails)
{
//do stuff
}
使用Html.TextBox我可以手动指定表单字段的名称'loginDetails.UserName'并回发到控制器,一切正常。
@model Web.Controllers.User.ViewModels.LoginPageViewModel
@using (Html.BeginForm()){
@Html.Hidden("loginDetails.ReturnUrl", Model.ReturnUrl)
@Html.LabelFor(x => x.EditForm.UserName, "User Name:")
@Html.TextBox("loginDetails.UserName", Model.EditForm.UserName)
@Html.ValidationMessageFor(x => x.EditForm.UserName)
.....
但我想要做的是使用staticaly类型的助手,例如:
@Html.TextBoxFor(x => x.EditForm.UserName)
但是我无法让它发挥作用。
您是否只能在使用强类型帮助程序时回发相同的模型?我有什么遗漏吗? Intellisense似乎没有提供任何线索,例如表单字段字符串。
答案 0 :(得分:1)
您可以指定前缀,以便默认模型绑定器可以成功解析属性:
[HttpPost]
public ActionResult Login(
[Bind(Prefix = "EditForm")]LoginFormViewModel loginDetails
)
{
...
}
现在可以随意使用强类型TextBoxFor
甚至更好:EditorFor
帮助器。