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"字符串?我可以自己找到并在复选框中使用它吗?
我不知道为什么你会想要手动生成复选框的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的丑陋黑客,没有更多数据来自视图.
| 归档时间: |
|
| 查看次数: |
5973 次 |
| 最近记录: |