Collections.Generic.Dictionary <tkey,tvalue>从Viewmodel到控制器的模型绑定</tkey,tvalue>

时间:2011-02-09 12:57:37

标签: asp.net-mvc-2 data-binding model asp.net-4.0

我有这个问题: 当我尝试将视图中的提交发布到httppost actionResult时,我总是得到一个空值。

这是我的代码:

    public class WhiteListViewModel
{
    public string Badge { get; set; }
    public IEnumerable<string> Selezioni { get; set; }
    public IEnumerable<bool> Abilitazioni { get; set; }
}


public ActionResult WhiteList()
{ 

    return View( "Whitelist", MasterPage, new WhitelistViewModel()); 
}

[HttpPost]
public ActionResult WhiteListp(IEnumerable<WhiteListViewModel> Whitelist )
{
            bool[] abilitato = new bool[Whitelist.Single().Abilitazioni.Count()];
            string[] selezione = new string[Whitelist.Single().Selezioni.Count()];            
 ...
}



    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/SiteR.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<_21112010.ViewModel.WhiteListViewModel>>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    WhiteList
</asp:Content
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>WhiteList</h2>         
   <table style="width:100%;">  
   <thead>      
 </thead>  
    <tbody >               
        <%using ( Html.BeginForm( ) )
   {%>  
            <%  foreach ( var item in Model ){%>
                    <tr style="width:100%;">
                <td >
                <%: item.Badge%>                
                </td>                
                <%foreach ( var abit in item.Abilitazioni ){%>
                 <td >                    
                    <%: Html.CheckBoxFor(c=>abit/*, new { onchange = "this.form.submit();" } */ )%>
                    <%: Html.ValidationMessageFor(c => abit) %>
                </td>                       
                <%  } %>
                <%} %> 
                <td style=" width:1px;" >
                <%: Html.HiddenFor(model=>item.Badge) %>
                <% foreach (var sel in item.Selezioni) {%>
                <%: Html.HiddenFor(c=>sel) %>
                <%} %>
                </td>
                </tr>                                   <%}%>                               
        </tbody> 
        <tfoot>
        </tfoot >
        </table>
     <input type="submit"  value="Salva ed Esci" style = "background-color:Gray; color:#F6855E; font-weight:bold;  border:1px solid black; height:20px;"  /> 
       <%:Html.ActionLink( "Aggiungi Badge", "AggiungiBadge")%>               
        <% } %>                     
        </div>
</asp:Content>

我在哪里做错了?

1 个答案:

答案 0 :(得分:0)

绑定过程将尝试将IEnumerable映射到HttpPost操作的参数Whitelist。但是,我很确定这是失败的,因为绑定过程没有信息将提交的字段绑定到预期的参数“Whitelist”。

您有几个选择:

  1. 尝试在您的操作中使用TryUpdateModel();

  2. 创建自定义ModelBinder。这将允许您在提交的模型传递给action参数之前插入提交的模型并构建您的IEnumerable;

  3. 您可以使用操作中的FormCollection对象来提交字段。这有点乱,不理想;

  4. 简化您的观点。

  5. 就个人而言,我会看一下ModelBinder。如果有的话,这将使您更好地了解模型可能无法绑定到操作参数的原因。