2011-02-09 71 views
0

我有这个问题: 当我尝试从视图提交提交到一个httppost actionResult我总是得到一个空值。Collections.Generic.Dictionary <TKey,Tvalue>从Viewmodel到控制器的模型绑定

这是我的代码:

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> 

我在哪里做错了吗?

回答

0

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

您有几种选择:

  1. 尝试在你的动作使用TryUpdateModel();

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

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

  4. 简化您的视图。

就我个人而言,我会看看ModelBinder。如果有的话,这会让您更好地了解为什么模型可能不绑定到动作参数。

相关问题