2013-03-09 5 views
5

Предположим, у меня есть модель, как это:модель связывания свойство сбора с частичным видом

public class Foo { 
    public List<Bar> Bars { get; set; } 
    public string Comment { get; set; } 
} 

public class Bar { 
    public int Baz { get; set; } 
} 

И я хочу, вид Foo, который позволяет пользователям редактировать Bar элементы. Но с уловкой: я хочу, чтобы редактирование Bar обрабатывалось частичным представлением.

@model Web.ViewModels.Foo 

@using(Html.BeginForm()) { 
    @Html.Partial("_EditBars", Model.Bars) 
    @Html.TextAreaFor(m => m.Comment) 
    ... 
} 

_EditBars частичного вид выглядит так:

@model List<Web.ViewModels.Bar> 

@for (int i = 0; i < Model.Count; i++) { 
    @Html.EditorFor(m => Model[i].Baz) 
} 

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

[HttpPost] 
public ActionResult Edit(Foo foo) { 
    // Do stuff 
} 

К сожалению, это данные что я размещаю, что не моделирует привязать свойство Bars:

[1].Baz=10&[0].Baz=5&Comment=bla 

Имеет смысл, что это не работает, потому что отсутствует префикс Bars. Если я правильно понимаю, мне нужно, чтобы это было так:

Bars[1].Baz=10&Bars[0].Baz=5&Comment=bla 

Итак, я попытался this approach:

@Html.Partial(
    "_EditBars", 
    Model.Bars, 
    new ViewDataDictionary(ViewData) 
    { 
     TemplateInfo = new TemplateInfo 
     { 
      HtmlFieldPrefix = "Bars" 
     } 
    }) 

Но это не работает, либо. При том, что я получаю:

Bars.[1].Baz=10&Bars.[0].Baz=5&Comment=bla 

Я предполагаю, что это не работает из-за дополнительного периода (Bars.[1] против Bars[1]). Есть ли что-нибудь, что я могу сделать, чтобы получить результат, который я желаю?

Примечание: Это серьезное упрощение моей реальной ситуации. Я понимаю, что с чем-то таким простым, лучший подход, вероятно, заключался бы в том, чтобы сделать EditorTemplate для Bar и пропустить его, используя EditorFor на мой взгляд. Если возможно, я бы хотел избежать этого решения.

+0

@gdp, отредактированный, чтобы показать частичный вид, и добавил примечание к нижней части моего вопроса. Благодаря! – Eric

+0

Вы когда-нибудь решали это в конце? с той же проблемой – user3281466

+0

Прошло некоторое время, поэтому я не помню подробностей, но, глядя на мои журналы фиксации, я кое-что совершил, задав этот вопрос, который ссылался на это: http://stackoverflow.com/questions/1488890/asp -net-mvc-partial-views-input-name-prefixes/6292180 # 6292180, которые, я считаю, могут быть связаны. – Eric

ответ

3

Как вы не хотите использовать EditorTemplate для Bar, решение вашего сценария может быть:

Изменение типа @model частичного просмотра «_EditBars» на Foo и вид должен быть как:

@model Foo 

@if (Model.Bars != null) 
{ 
    for (int i = 0; i < Model.Bars.Count; i++) 
    { 
     @Html.EditorFor(m => Model.Bars[i].Baz) 
    } 
} 

(было бы лучше, чтобы изменить название Частичного вида на '_EditFooBars')

Надеется, что это помогает.

+0

Это было бы хорошим решением, спасибо. – Eric

+0

-1 Это работает, но это не многоразовый и плохой дизайн. – Levitikon

Смежные вопросы