Как получить значение атрибута name = "" для других свойств ViewModel? - PullRequest
0 голосов
/ 25 сентября 2018
  • Мое веб-приложение ASP.NET Core имеет форму входа на двух разных страницах.
  • Одна страница (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 голосов
/ 25 сентября 2018

Использовать компонент просмотра.Создайте файл ViewComponents\LoginViewComponent.cs.Внутри:

public class LoginViewComponent : ViewComponent
{
    public Task<IViewComponentResult> InvokeAsync() =>
        Task.FromResult(View());
}

Затем создайте представление Views\Shared\Components\Login\Default.cshtml.Внутри добавьте код формы входа.Наконец, в обоих видах входа в систему и в главном окне добавьте следующее, где вы хотите, чтобы форма отображалась:

@await Component.InvokeAsync("Login")
0 голосов
/ 25 сентября 2018

Я могу разобраться, используя оператор nameof(), который дает мне тот же вывод для тривиальных свойств:

<input type="text"     name="@( nameof(LoginViewModel.UserName) )" />
<input type="password" name="@( nameof(LoginViewModel.Password) )" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...