asp.net MVC模型如何生成输入名称?

Dav*_*ave 2 razor asp.net-mvc-3

在使用Razor标记的MVC中的EditorFor视图中,如果执行此操作:

@Html.TextBox("")
Run Code Online (Sandbox Code Playgroud)

HTML提供了模型的正确输入名称,如下所示:

<input id="usr_Roles" name="usr.Roles" type="text" value="">
Run Code Online (Sandbox Code Playgroud)

"usr.Roles"名称来自此EditorFor行:

@Html.EditorFor(modelItem => usr.Roles, "RoleList") 
Run Code Online (Sandbox Code Playgroud)

不幸的是,我正在尝试生成一组名为"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>
} 
Run Code Online (Sandbox Code Playgroud)

上面的工作,但只是因为我手动指定"usr.Roles"作为复选框名称.

我的问题是:在对象和属性的迷宫中,@ Html.TextBox对象在哪里找到"usr.Roles""usr-Roles"字符串?我可以自己找到并在复选框中使用它吗?

Dar*_*rov 7

我不知道为什么你会想要手动生成复选框的id和名称,而不是简单地使用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>
} 
Run Code Online (Sandbox Code Playgroud)

显然,这里显示纯粹出于某些教育目的.我真的会避免这种怪异,只需使用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; }
}
Run Code Online (Sandbox Code Playgroud)

然后你编写一个控制器动作来查询你的数据并填充视图模型:

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

然后你会有一个Index.cshtml观点:

@model MyViewModel
@Html.EditorFor(x => x.Roles)
Run Code Online (Sandbox Code Playgroud)

以及将为Roles集合(~/View/Shared/EditorTemplates/RoleViewModel.cshtml)的每个元素呈现的相应编辑器模板:

@model RoleViewModel
@Html.CheckBoxFor(x => x.Selected)
@Html.LabelFor(x => x.Selected, Model.RoleName)
Run Code Online (Sandbox Code Playgroud)

foreach视图中没有更多循环,不再有名称和ID的丑陋黑客,没有更多数据来自视图.