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

Asp.net mvc 3 asp.net MVC模型如何生成输入名称?,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,在带有Razor标记的MVC中的EditorFor视图中,如果执行以下操作: @Html.TextBox("") HTML为模型提供了正确的输入名称,如下所示: <input id="usr_Roles" name="usr.Roles" type="text" value=""> 不幸的是,我试图生成一组名为“usr.Roles”的复选框。由于MVC呈现复选框的方式,我不能使用Html.Checkbox。我可以手动生成它们,如下所示: @foreach (string role

在带有Razor标记的MVC中的EditorFor视图中,如果执行以下操作:

@Html.TextBox("")
HTML为模型提供了正确的输入名称,如下所示:

<input id="usr_Roles" name="usr.Roles" type="text" value="">
不幸的是,我试图生成一组名为“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>
} 
@foreach(Roles.GetAllRoles()中的字符串roleName)
{
字符串checkboxId=“checkbox_389;”+roleName;
@罗兰胺
} 
上述方法有效,但这只是因为我手动指定“usr.Roles”作为复选框名称


我的问题是:在错综复杂的对象和属性中,
@Html.TextBox
对象在哪里找到“usr.Roles”“usr Roles”字符串?我能自己找到它并在复选框中使用它吗?

我不知道你到底为什么想要手动生成你的复选框的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>
} 
然后编写一个控制器操作,该操作将查询数据并填充视图模型:

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
):


视图中不再有
foreach
循环,不再有名称和ID的丑陋攻击,不再有从视图中提取的数据。

据我所知,您希望从模型中生成属性名称, 我建议您使用以下方法:

ExpressionHelper.GetExpressionText

从System.Web.Mvc assembly

中,使用HTML帮助程序非常简单

您可以这样使用它:

@Html.NameFor(modelItem => usr.Roles)

要回答最初的问题,CheckBoxFor方法仅在使用复选框生成布尔值时有效。该代码甚至生成一个隐藏字段,以确保始终为复选框返回值。我正试图返回一个列表,所以根本不起作用。@Dave,
List
?从复选框中?嗯。在我展示的示例中,您可以简单地将角色名称作为隐藏字段添加到编辑器模板中,然后在post controller操作中,您将获得
IEnumerable
,其中当然将包含整个角色名称列表,以及哪些角色名称被选中或未选中。是的,您所描述的内容与”“对“这是我努力实现目标的方式。但你甚至回答了我最初的问题,尽管有缺陷。谢谢如果您好奇的话,列出这个列表的原因是默认RoleManager将数组作为添加角色的参数,所以我想我还是从模型中的数组开始吧。我想我会按照你的方式重做。如果我要使用MVC,我也可以正确地使用它。如果您查看接受答案的注释,您就会明白为什么这对我不起作用。@Dave,您的问题标题是“asp.net MVC模型如何生成输入名称?”正文似乎支持这一点
EditorFor
CheckBoxFor
等都很好,但这是内部用于为表单元素创建名称的方法。这对于无法在服务器端呈现表单元素,但在发布表单时仍希望使用模型绑定的情况非常有用。
@model RoleViewModel
@Html.CheckBoxFor(x => x.Selected)
@Html.LabelFor(x => x.Selected, Model.RoleName)
ExpressionHelper.GetExpressionText
@Html.NameFor(modelItem => usr.Roles)