2010-11-12 73 views
0

比方说,我已经在波纹管模型ASP.NET MVC如何绑定List <T>类型的属性?

public class UserInformation 
{ 
    public List<UserInRole> RolesForUser { get; set; }  
    //Other properties omitted... 
} 

public class UserInRole 
{ 
    public string RoleName { get; set; } 
    public bool InRole { get; set; } 
} 

在我的网页我有类似

<%using(Html.BeginForm()){%> 
    .../... 
    <%for(int i =0; i<Model.InRoles.Cout; i++%> 
    <p><%: Html.CheckBox(Model.Roles[i].RoleName, Model.Roles[i].InRole)%></p> 
<%}%> 

的想法是能够检查/取消选中该复选框,这样,当窗体发布通过在每个角色中添加/删除用户,操作可以适当地执行。

问题是当表单发布到操作方法时,Roles属性(它是一个列表UserInRole对象)不反映用户所做的更改。 ModelBinder适用于所有其他属性,但'角色属性'

我想知道我该怎么做。我怀疑赋予复选框的名称/ ID不合适。但是,我只是堆栈。也许我应该以不同的方式做。

感谢您的帮助

+0

[复杂模型绑定到一个列表(的可能重复http://stackoverflow.com/questions/231878/complex-model-binding-to-a -list) – jfar 2010-11-12 13:04:58

回答

2

您应该看到model binding to a list菲尔哈克的帖子。 基本上你需要的只是提交一堆表单域,每个表单域都有相同的名字。

<%@ Page Inherits="ViewPage<UserInformation>" %> 

<% for (int i = 0; i < 3; i++) { %> 

    <%: Html.EditorFor(m => m.RolesForUser[i].RoleName) %> 
    <%: Html.EditorFor(m => m.RolesForUser[i].InRole) %> 

<% } %> 
+0

好吧,这比我想象的要容易得多。非常感谢。 – Richard77 2010-11-12 10:59:33

+0

请检查我的问题。现在我正在检查你的答案,我看到你让页面继承IList 。但该模型是UserInformation,其中包含List 。因为我尝试了你的建议,但我仍然得到空值。 – Richard77 2010-11-12 12:41:06

+0

尝试使用m => m.RolesForUser [i] – 2010-11-12 13:21:36

1

我认为问题在于如何提交表单数据。对于模型绑定来说,它需要键名和相关的值。根据你的代码应该正确绑定下面的代码:

<%using(Html.BeginForm()){%> 
    .../... 
    <%for(int i =0; i<Model.RolesForUser.Count; i++%> 
    <p> 
    <%: Html.Hidden("UserInformation.RolesForUser[" + i + "].RoleName", Model.RolesForUser[i].RoleName) %> 
    <%: Html.CheckBox("UserInformation.RolesForUser[" + i + "].InRole", Model.RolesForUser[i].InRole) %> 
    <%: Model.RolesForUser[i].RoleName %> 
    </p> 
<%}%> 
+0

有趣!只有一件事。你为什么使用Html.Hidden? – Richard77 2010-11-12 11:03:57

+0

为了完整性,我包含了RoleName属性,但当然如果您担心被篡改的值,可能会忽略它。 – 2010-11-12 11:20:31

+0

列表仍然为空。 – Richard77 2010-11-12 12:37:02