如何获得另一个ViewModel属性的name =“”属性值?

时间:2018-09-25 00:36:04

标签: asp.net-mvc asp.net-core

  • 我的ASP.NET Core Web应用程序在两个不同的页面上都有一个登录表单。
  • 一页(Login.cshtml)是主要的登录表单,并使用LoginViewModel
  • 另一页(Main.cshtml)具有自己的ViewModel类型。此页面上的<form>POST移至首页,如下所示:

LoginViewModel.cs

class LoginViewModel {

    [Required]
    public String UserName { get; set; }

    [Required]
    public String Password { get; set; }
}

Login.cshtml

@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>

Main.cshtml

@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”。

2 个答案:

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