代码之家  ›  专栏  ›  技术社区  ›  Andrew

为什么我的复选框没有绑定到我的视图模型?

  •  1
  • Andrew  · 技术社区  · 14 年前

    我使用编辑器模板来显示复选框。问题是当我执行编辑操作并发布表单时,类别将返回为空。我读过一些类似的问题,但还没有找到一个可行的解决方案。

    业务视图模型

    public class BusinessViewModel
        {
    
            public int? Id { get; set; }
    
            [UIHint("ContactDetailsEditorTemplate")]
            public ContactDetailsViewModel ContactDetailsViewModel { get; set; }
    
            [UIHint("CheckboxEditorTemplate")]
            public IEnumerable<CheckboxViewModel> Categories { get; set; }
    
        }
    

    复选框视图模型

    public class CheckboxViewModel
    {
        public int CategoryId { get; set;}
        public string Description { get; set;}
        public bool Checked { get; set; }
    }
    

    复选框模板

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<ViewModels.BuyWithConfidence.CheckboxViewModel>>" %>
    <table class="aligncenter">
      <tr class="tRow left"><%
        var intBreakLine = 0;
        if (Model != null)
        {
          foreach (var category in Model)
      {
        if (intBreakLine >= 2)
        {
          intBreakLine = 0;%>
          </tr>
          <tr class="tRow left"><%
        }%>
          <td>           
            <%= Html.Hidden(string.Format("Categories[{0}].CategoryID", i), category.CategoryId) %>
            <%= Html.CheckBox(string.Format("Categories[{0}].Checked", i), category.Checked) %>
          </td>
          <td><%=category.Description%></td><%
        intBreakLine = intBreakLine + 1;
        i = i + 1;  
      }
        }%>                        
      </tr>
    </table>
    

    这是模板正在生成的片段:

    <input id="Categories_Categories_0__CategoryID" name="Categories.Categories[0].CategoryID" type="hidden" value="1" />
            <input id="Categories_Categories_0__Checked" name="Categories.Categories[0].Checked" type="checkbox" value="true" /><input name="Categories.Categories[0].Checked" type="hidden" value="false" />
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   dotjoe    14 年前

    看起来你最终会得到3个输入,都被命名为CategoryId。你有没有考虑过使用 .index array[] 符号。

    <%= Html.Hidden("Categories.index", category.CategoryID) %>
    <%= Html.Hidden(string.Format("Categories[{0}].CategoryID", category.CategoryID), category.CategoryID) %>
    <%= Html.CheckBox(string.Format("Categories[{0}].Checked", category.CategoryID), category.Checked) %>
    

    如果订单不变,您可以使用 for(int i...

    <%= Html.Hidden(string.Format("Categories[{0}].CategoryID", i), category.CategoryID) %>
    <%= Html.CheckBox(string.Format("Categories[{0}].Checked", i), category.Checked) %>
    

    http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx