Модель связывания во время публикации формы внутри EditorTemplate (в массиве) / несколько префиксов связывания? - PullRequest
0 голосов
/ 29 июня 2011

У меня сложная модель, содержащая массив.Для рендеринга элементов этого массива я использую EditorFor так:

for (int i = 0; i < Model.Contacts.Phones.Length; i++)
{       
    @Html.EditorFor(x => x.Contacts.Phones[i])
}

Внутри редактора есть пост-форма.Проблема в том, что привязка успешна только тогда, когда я точно указываю префикс привязки:

[HttpPost]
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones[0]")]Contact5UsedPhone model)
{ ... }

Так что она работает только для первого из элементов.Какая правильная форма префикса?

Более того, на одном и том же редакторе страниц имеется другое свойство, но поэтому выполняется один и тот же тип модели и одно и то же действие.Можно ли установить более одного префикса привязки?Например,

[HttpPost]
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones[0], Contacts.AnotherPrefix")]
    Contact5UsedPhone model)
{ ... }

Спасибо!

edit - модель:

public class ContactsViewModel
{
    public Contact5UsedPhone AddiblePhone {get;set;}
    public Contact5UsedPhone[] Phones {get;set;}
    ...
}

edit - answer: Я нашел решение для этого.Поскольку существует один массив (телефоны) и одна единица (AddiblePhone), я использовал два параметра и просто, если:

[HttpPost]
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones")]Contact5UsedPhone[] models, 
    [Bind(Prefix = "Contacts.AddiblePhone")]Contact5UsedPhone model)
{
    model = model ?? models[0];
    ...
}

Остается вопрос - что, если бы AddiblePhones был массивом?Можно ли использовать два префикса для одного параметра или его нужно разделить на два параметра, как я сделал в этом случае?

Ответы [ 2 ]

1 голос
/ 30 июня 2011
1 голос
/ 30 июня 2011

Мы нашли ясный и простой ответ на этот вопрос:

@Html.EditorFor(x => x.Phones[i], 
    "~/Views/Contacts/EditorTemplates/Contact5UsedPhone.cshtml", 
    "")

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

Остается небольшой вопрос - а что если бы в качестве массива были AddiblePhones? Можно ли использовать два префикса для одного параметра или его нужно разделить, как я предлагал в ответе на вопрос? Но, вероятно, это сигнализирует о плохом дизайне, если нужно что-то подобное ...

РЕДАКТИРОВАТЬ (Telerik контролирует): Проблема этого приятного решения возникает при использовании раскрывающегося списка Telerik, поскольку он генерирует не уникальные идентификаторы для элементов, и эти элементы управления управляются jQuery, поэтому он не работает должным образом.

ПРЕДУПРЕЖДЕНИЕ: Я обнаружил, что при использовании атрибута Bind вы НЕ МОЖЕТЕ использовать "" (пробел) между атрибутом и типом параметра.

работает:

[Bind(Prefix = "Phones")]Contact5UsedPhone[]

не работает:

[Bind(Prefix = "Phones")] Contact5UsedPhone[]

Я не знаю, является ли это только случаем массивов. Но мне это кажется странным.

...