2010-06-28 4 views
1

У меня есть модель для бизнеса. Эта модель использует модель представления для адреса, контактной информации, а также IEnumerable.Почему мои флажки не привязаны к моей модели просмотра?

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

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

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

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

+0

я все еще получаю нуль для trader.categories, когда после действия удара. Я попробовал оба выше и начал i по 0 – Andrew

+0

Я обновил вопрос с html, который он создает, может быть, вы можете что-то заметить? – Andrew

+0

Полученный html должен быть назван 'Категории [69]. *'. Почему это 'Categories.Categories [69]. *'? Это скажет связующему, что он ищет свойство с именем «Категории», в котором есть коллекция «Категории». – dotjoe