Как модель asp.net MVC генерирует входные имена? - PullRequest
2 голосов
/ 19 июля 2011

В редакторе для представления в MVC с разметкой Razor, если вы сделаете это:

@Html.TextBox("")

HTML-код содержит правильное имя для модели, например:

<input id="usr_Roles" name="usr.Roles" type="text" value="">

Название "usr.Roles" происходит из этой строки редактора:

@Html.EditorFor(modelItem => usr.Roles, "RoleList") 

К сожалению, я пытаюсь сгенерировать набор флажков с именем "usr.Roles". Из-за способа, которым MVC отображает флажки, я не могу использовать Html.Checkbox. Я могу сгенерировать их вручную так:

@foreach (string roleName in Roles.GetAllRoles())
{
    string checkboxId = "checkbox_" + roleName;
    <input type="checkbox" name="usr.Roles" id="@checkboxId" value="@roleName" @Html.Raw(Model.Contains(roleName) ? "checked" : "") />
    <label for="@checkboxId">@roleName</label>
} 

Вышеописанное работает, но только потому, что я вручную указываю "usr.Roles" в качестве имени флажка.

У меня такой вопрос: где в лабиринте объектов и свойств объект @Html.TextBox находит строки "usr.Roles" "usr-Roles"? И могу ли я сам найти его и использовать в флажках?

Ответы [ 3 ]

7 голосов
/ 19 июля 2011

Я не знаю, с какой стати вы захотите вручную генерировать идентификаторы и имена ваших флажков вместо простого использования хелпера Html.CheckBoxFor, который сделает все это за вас, но в случае, если у вас есть какие-то причины, вот как:

@{
    var name = ViewData.TemplateInfo.GetFullHtmlFieldName("");
}

@foreach (string roleName in Roles.GetAllRoles())
{
    string checkboxId = "checkbox_" + roleName;
    <input type="checkbox" name="@name" id="@checkboxId" value="@roleName" @Html.Raw(Model.Contains(roleName) ? "checked" : "") />
    <label for="@checkboxId">@roleName</label>
} 

Очевидно, что это показано здесь чисто для некоторых образовательных целей.Я действительно избежал бы такого уродства и просто использовал бы помощники HTML и шаблоны редактора.Еще одна вещь, которая шокирует меня, на ваш взгляд, это следующая строка кода: Roles.GetAllRoles().Это как если бы ваш взгляд запрашивал данные.Это последнее, что должен сделать вид.Контроллер отвечает за запрос данных, заполнение модели представления и передачу этой модели представления в представление, чтобы оно просто отображало данные.

Итак, давайте попробуем разработать ваш пример.Из того, что я могу понять, вы пытаетесь показать список флажков для каждой роли, чтобы пользователь мог выбрать их.

Как всегда, вы начинаете с модели представления, выражающей ваши требования к представлениям:

public class MyViewModel
{
    public IEnumerable<RoleViewModel> Roles { get; set; }
}

public class RoleViewModel
{
    public string RoleName { get; set; }
    public bool Selected { get; set; }
}

, затем вы пишете действие контроллера, которое будет запрашивать ваши данные и заполнять модель представления:

public ActionResult Index()
{
    var roles = Roles.GetAllRoles();
    var model = new MyViewModel
    {
        Roles = roles.Select(role => new RoleViewModel
        {
            RoleName = role,
            Selected = ??????
        })
    };
    return View(model);
}

тогда у вас будет Index.cshtml представление:

@model MyViewModel
@Html.EditorFor(x => x.Roles)

и соответствующий шаблон редактора, который будет отображаться для каждого элемента коллекции ролей (~/View/Shared/EditorTemplates/RoleViewModel.cshtml):

@model RoleViewModel
@Html.CheckBoxFor(x => x.Selected)
@Html.LabelFor(x => x.Selected, Model.RoleName)

Нет больше foreach циклов в представлениях, больше нет отвратительных хаков с именами и идентификаторами, больше нет данных, извлекаемых из представлений.

1 голос
/ 19 июля 2011

Как я понимаю, вы хотите сгенерировать имя свойства из вашей модели, Я предлагаю вам использовать метод:

ExpressionHelper.GetExpressionText

из сборки System.Web.Mvc

0 голосов
/ 03 мая 2019

Это довольно просто с помощью NameExtensions.NameFor HTML-помощника.

Вы можете использовать его так:

@Html.NameFor(modelItem => usr.Roles)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...