Login.cshtml
)是主要的登录表单,并使用LoginViewModel
。Main.cshtml
)具有自己的ViewModel类型。此页面上的<form>
将POST
移至首页,如下所示:class LoginViewModel {
[Required]
public String UserName { get; set; }
[Required]
public String Password { get; set; }
}
@model LoginViewModel
<section>
@using( Html.BeginForm() ) {
<div class="field">
@Html.TextBoxFor( m => m.UserName )
@* validation messages, display-names, etc omitted for brevity *@
</div>
<div class="field">
@Html.PasswordFor( m => m.Password )
</div>
}
</section>
@model MainViewModel
<h2>Login</h2>
<form action="@Url( action: "Login" )" method="post">
<div class="field">
@Html.TextBoxFor( m => /* What goes here? */ )
</div>
<div class="field">
@Html.PasswordFor( m => /* What goes here? */ )
</div>
</form>
<h2>Register</h2>
<!-- etc -->
我知道我可以简单地对<input type="text" name="UserName" />
和<input type="password" name="Password" />
进行硬编码,但是如果我要重命名LoginViewModel::UserName
,例如由于它变成了魔术字符串,那会带来维护问题。
我不能简单地将LoginViewModel
添加为MainViewModel
的成员,因为这样TextBoxFor( m => m.LoginVM.UserName )
将呈现不正确的`name =“ LoginVM.UserName”。
答案 0 :(得分:-1)
使用视图组件。创建文件ViewComponents\LoginViewComponent.cs
。内部:
public class LoginViewComponent : ViewComponent
{
public Task<IViewComponentResult> InvokeAsync() =>
Task.FromResult(View());
}
然后,创建视图Views\Shared\Components\Login\Default.cshtml
。在内部,添加登录表单代码。最后,在“登录”和“主要”视图中,在要显示表单的位置添加以下内容:
@await Component.InvokeAsync("Login")
答案 1 :(得分:-2)
我可以使用nameof()
运算符对它进行分类,从而为琐碎的属性提供相同的输出:
<input type="text" name="@( nameof(LoginViewModel.UserName) )" />
<input type="password" name="@( nameof(LoginViewModel.Password) )" />