Вложенные шаблоны редактирования в бритве mvc - PullRequest
2 голосов
/ 24 августа 2011

Я видел много версий этого вопроса, но ответы всегда превращаются в «вам не нужно этого делать», а ответа никогда нет.

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

В моей модели:

public List<ProductAttribute> ProductAttributes {get;set;}

в моем Create.cshtml:

   <div Class="ProductAttributes">
        @Html.EditorFor(m => m.ProductAttributes, "ProductAttributeSelectorList")
   </div>

В моем ProductAttributeSelectorList.cshtml:

 @model List<Models.DisplayLocationAttribute>
 <div class="AttributeSelector">
     <ul>
        @foreach (var item in Model)
           {     
           <li>
             @Html.EditorFor(_ => item, "EditLocationAttributeList")
           </li> 
           }
    </ul>
</div>

И, наконец, в моем EditLocationAttributeList.cshtml

@model Models.DisplayLocationAttribute
@Html.HiddenFor(m => m.Id)
@Html.CheckBoxFor(m => m.IsSelected)
<a href="#" alt="@Model.Description" >@Model.Name</a>

Все это прекрасно отображается на странице, я могу стилизовать его так, как хочу с помощью CSS, но когда отправляювозвращается, моя модель. Коллекция ProductctAttributes имеет значение null.

Я знаю, что могу связать непосредственно с EditLocationAttributeList, и он будет отображать и возвращать заполненную модель .ProductAttributes, если я использую это:

 @Html.EditorFor(m => m.ProductAttributes, "EditLocationAttributeList")

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

Любые идеи?

Заранее спасибо,

Тал

1 Ответ

2 голосов
/ 24 августа 2011

model.ProductAttributes - ноль, поскольку DefaultModelBinder не может ссылаться на каждый DisplayLocationAttribute обратно на свойство ProductAttribute вашей модели.Самое простое решение - назвать элементы списка в виде массива, чтобы, например, каждый элемент IsSelected был назван в стиле ProductAttributes[n].IsSelected.

Добавьте следующее в ProductAttributeSelectorList.cshtml:

@model List<Models.DisplayLocationAttribute>
@{
    var i = 0;
}
<div class="AttributeSelector">
    <ul>
    @foreach (var item in Model)
    {     
        this.ViewData.TemplateInfo.HtmlFieldPrefix = "ProductAttributes[" + 
            i.ToString() + "]";
        i++;
        <li>
            @Html.EditorFor(_ => item, "EditLocationAttributeList")
        </li> 
    }
    </ul>
</div>
@{
    this.ViewData.TemplateInfo.HtmlFieldPrefix = ""; 
}

Это даст вам индексированный массив, который DefaultModelBinder сможет связать с ProductAttributes.Тем не менее, он создает жесткую зависимость от имени ProductAttributes.Вы можете обойти жесткую зависимость несколькими способами, например, передавая имя свойства во ViewBag.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...