Почему мои флажки не привязаны к моей модели просмотра? - PullRequest
1 голос
/ 28 июня 2010

У меня есть модель представления для бизнеса. Эта модель содержит модель представления для адреса, контактных данных, а также IEnumerable.

Я использую шаблоны редактора для отображения флажков. Проблема в том, что когда я нахожусь в действии редактирования и публикую форму, категории возвращаются как нулевые Я прочитал несколько похожих вопросов, но не нашел решения, которое, кажется, работает.

Я безуспешно изучил пользовательские связующие модели, и в настоящее время я думаю, что не отображаю нужную информацию в шаблоне редактора. Я знаю, что флажки нуждаются в скрытом вводе, чтобы быть с ними, и, возможно, моя проблема лежит там?

BusinessViewModel

public class BusinessViewModel
    {

        public int? Id { get; set; }

        [UIHint("ContactDetailsEditorTemplate")]
        public ContactDetailsViewModel ContactDetailsViewModel { get; set; }

        [UIHint("CheckboxEditorTemplate")]
        public IEnumerable<CheckboxViewModel> Categories { get; set; }

    }

CheckboxViewModel

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

CheckboxEditorTemplate

<%@ 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 Ответ

1 голос
/ 28 июня 2010

Похоже, что в итоге вы получите 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

...