use*_*801 4 asp.net-mvc asp.net-mvc-3
我的问题是我必须创建如下的布局使用MVC为用户分配权限.
现在创建复选框没有问题,我将使用用户列表创建它.但在提交表格时,我应该将其提交到下面的列表中.
public class UserRightsViewModel
{
public UserRightsViewModel()
{
_screenrights = new List<ScreenRight>();
}
public String Id { get; set; }// Role Name
List<ScreenRight> _screenrights;
public List<ScreenRight> ScreenRights { get { return _screenrights; } set { _screenrights = value; } }
}
Run Code Online (Sandbox Code Playgroud)
screenRight的定义如下
public class ScreenRight
{
public String UserName { get; set; }
public Boolean Select{ get; set; }
public Boolean Add{ get; set; }
public Boolean Edit{ get; set; }
,,,
}
Run Code Online (Sandbox Code Playgroud)
现在,在提交表单时,我如何以正确的格式将其发布到控制器.
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new UserRightsViewModel
{
// Obviously those could come from some data source
ScreenRights = new[]
{
new ScreenRight { UserName = "Robert", Select = true, Add = false, Edit = false },
new ScreenRight { UserName = "John", Select = true, Add = true, Edit = false },
new ScreenRight { UserName = "Mike", Select = true, Add = true, Edit = false },
new ScreenRight { UserName = "Allan", Select = true, Add = true, Edit = true },
new ScreenRight { UserName = "Richard", Select = false, Add = false, Edit = false },
}.ToList()
};
return View(model);
}
[HttpPost]
public ActionResult Index(UserRightsViewModel model)
{
// The view model will be correctly populated here
// TODO: do some processing with them and redirect or
// render the same view passing it the view model
...
}
}
Run Code Online (Sandbox Code Playgroud)
视图:
@model UserRightsViewModel
@using (Html.BeginForm())
{
<table>
<thead>
<tr>
<th>User Id</th>
<th>Select</th>
<th>Add</th>
<th>Edit</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.ScreenRights.Count; i++)
{
<tr>
<td>
@Html.DisplayFor(x => x.ScreenRights[i].UserName)
@Html.HiddenFor(x => x.ScreenRights[i].UserName)
</td>
<td>
@Html.CheckBoxFor(x => x.ScreenRights[i].Select)
</td>
<td>
@Html.CheckBoxFor(x => x.ScreenRights[i].Add)
</td>
<td>
@Html.CheckBoxFor(x => x.ScreenRights[i].Edit)
</td>
</tr>
}
</tbody>
</table>
<button type="submit">OK</button>
}
Run Code Online (Sandbox Code Playgroud)
进一步阅读:Model Binding To a List
.
要向后工作,最终的HTML应如下所示(忽略您的表格)
<input type="hidden" value="0" name="ScreenRights[0].Select"/>
<input type="checkbox" name="ScreenRights[0].Select"/>
<input type="hidden" value="0" name="ScreenRights[0].Add"/>
<input type="checkbox" name="ScreenRights[0].Add"/>
<input type="hidden" value="0" name="ScreenRights[0].Edit"/>
<input type="checkbox" name="ScreenRights[0].Edit"/>
<input type="hidden" value="0" name="ScreenRights[1].Select"/>
<input type="checkbox" name="ScreenRights[1].Select"/>
<input type="hidden" value="0" name="ScreenRights[1].Add"/>
<input type="checkbox" name="ScreenRights[1].Add"/>
<input type="hidden" value="0" name="ScreenRights[1].Edit"/>
<input type="checkbox" name="ScreenRights[1].Edit"/>
Run Code Online (Sandbox Code Playgroud)
我们的想法是索引顺序显示在属性名称的[i]数组部分中,然后链接到下一个属性.它应该以与你的i相同的顺序绑定.这里的另一个关键是复选框仅与CHECKED属性绑定,因此值对绑定器没有意义.这就是为什么你在前面有隐藏的输入.绑定程序将始终指定false,如果选中该复选框,则覆盖为true.您可以在简单模型上使用Html.CheckBoxFor验证此结果html.
在让HTML看起来像这样,你可以手动完成,或者你可以使用内置框架.
我很确定你可以在for循环中做这个(我作为迭代器)
@Html.CheckBoxFor(m => m.ScreenRights[i].Select)
@Html.CheckBoxFor(m => m.ScreenRights[i].Add)
@Html.CheckBoxFor(m => m.ScreenRights[i].Add)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19105 次 |
最近记录: |