MVC 3 从视图、模型中检索复选框值

Posted

技术标签:

【中文标题】MVC 3 从视图、模型中检索复选框值【英文标题】:MVC 3 Retrieve checkbox values from View, Model 【发布时间】:2015-11-29 17:58:31 【问题描述】:

也许(实际上我确定)是我,但我似乎无法弄清楚如何检索列表项作为模型对象的一部分。 here 的帖子似乎让每个人都满意,但在我有限的理解中,这两个答案都不相关。 我需要获取已检查的项目,以便更新 Db。听起来很简单。

我的模特:

    public class UserAdminModel

    public Guid UserId  get; set; 
    public string UserName  get; set; 
    public List<UserRole> UserRoles  get; set; 
    public string csvAllRolls  get; set; 


public class UserRole

    public Guid RoleId  get; set; 
    public string UserRoleName  get; set; 
    public bool UserisinRole   get; set; 

我的观点:

<% using (html.BeginForm("UpdateRoles", "UserAdmin", FormMethod.Post))
%>

<input type="hidden" id="UserId" name="UserId" value="<%: Model.UserId %>" />
...

<%  foreach (var role in Model.UserRoles)
      %>
<tr>

    <td>&nbsp;</td>
    <td colspan="2" nowrap="nowrap"><%: role.UserRoleName %></td>
    <td>&nbsp;</td>
    <td>
        <input type="checkbox" id="UserRoles" name="UserRoles" value="<%: role.UserRoleName %>"
            <% if (role.UserisinRole)  %>                
             checked="checked"
            <%  %>
             /></td>
</tr>
<%   %>
...
        <input type="submit" name="Submit" value="Update Roles" /></td>
<%   %>

我的控制器:

        [HttpPost]
    public ActionResult UpdateAllRoles(UserAdminModel model)
    
        Guid uid = new Guid( Request["UserId"]);


        return RedirectToAction("Index", "MyController");
    

UserId 很好,但模型的其余部分为空。任何帮助将不胜感激。

【问题讨论】:

您创建了带有name 属性的复选框,这些属性与您的模型完全没有关系。这样做的目的是为了列出所有可用的角色并能够将它们分配给用户(通过选择复选框)? 是的,我想列出所有角色(带有复选框),预先选择用户已经分配到的角色,然后通过选中或取消选中所需角色让用户进行更新。我目前继承的应用程序让用户分别进入每个角色,一次添加/删除一个用户。我尝试了许多变体来设置与我的模型的关系,但无济于事,这就是我在这里发布的原因。谢谢 【参考方案1】:

您需要使用for 循环,以便您的表单控件具有正确的名称属性以绑定到您的模型(我会留给您从剃刀转换为 aspx)

@using (Html.BeginForm("UpdateRoles", "UserAdmin", FormMethod.Post))

  @Html.HiddenFor(m => m.UserId) // or add this as a route parameter in BeginForm()
  ...
  for(int i = 0; i < Model.UserRoles.Count; i++)
  
    @Html.HiddenFor(m => m.UserRoles[i].RoleId)
    @Html.CheckBoxFor(m => m.UserRoles[i].UserisinRole)
    @Html.LabelFor(m => m.UserRoles[i].UserisinRole, Model.UserRoles[i].UserRoleName)
  
  <input type="submit" name="Submit" value="Update Roles" />

当您提交表单时,model.UserRoles 将包含所有角色,您可以使用获取所选角色

var selectedRoles = model.UserRoles.Where(r => r.UserisinRole);

旁注:在这里使用&lt;table&gt; 似乎不合适。

【讨论】:

以上是关于MVC 3 从视图、模型中检索复选框值的主要内容,如果未能解决你的问题,请参考以下文章

在控制器 mvc 4 中获取复选框值

复选框不适用于布尔视图模型属性

MVC 3 在 IEnumerable 模型视图中编辑数据

在 MVC/Razor 中,如何获取多个复选框的值并将它们全部传递给控制器​​?

如何使用 DataAnnotations 处理 ASP.NET MVC 2 中的布尔值/复选框?

从复选框集合中返回一串选定值