Более одного Http.RenderAction() в одном представлении

Как мы все знаем, RenderAction() является частью:

  • Asp.net MVC 1 Фьючерсы или
  • Asp.net MVC 2 Бета 2

и позволяет нам отображать результат действия внутри другого представления или частичного представления.

Описание

  1. У вас есть представление с несколькими частичными представлениями, отображаемыми с помощью помощника RenderAction().
  2. По крайней мере, два частичных представления отображают <form>, вероятно, используя Html.BeginForm() эту обратную передачу в исходное представление.
  3. Постбэк не выполняется через вызов Ajax
  4. Данные обратной передачи проверяются в форме POST.

Проблема

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

Кто-нибудь использовал этот шаблон и решил его? Мы каким-то образом должны знать, какой form выполняет обратную передачу, и только этот должен проверять свои данные POST. Другие должны либо игнорировать проверку, либо выполнять обычную обработку действий HttpVerb.Get.


person Robert Koritnik    schedule 26.11.2009    source источник


Ответы (1)


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

О префиксах. Первый способ — иметь два свойства, вызывая Html.RenderPartial("partial", Model.Data1/2.WithPrefix("data1")).

public class FormModel
{
   public string Prefix { get; set; }
}

public class FormData
{
   public FormModel Data1 { get; set; }
   public FormModel Data2 { get; set; }
}

public ActionResult HandlePost(FormData data)
{
   if (data.Data1 != null) {} else {}
}

Второй способ такой же, но использует два параметра действия.

public ActionResult HandlePost(FormModel data1, FormModel data2)
{
   if (data1 != null) {} else {}
}

В частичном представлении вы делаете

<%= Html.TextBox(Model.Prefix + ".FormModelField", Model.FormModelField) %>

то есть вы устанавливаете имя поля с префиксом, переданным в модели.

Конечно, вы можете изменить это в деталях.

person queen3    schedule 26.11.2009
comment
Я понимаю первую часть о скрытом поле, но не понимаю второе предложение. Добавить к идентификаторам элементов или где? Можешь перефразировать, пожалуйста? - person Robert Koritnik; 26.11.2009
comment
добавление префиксов может означать, что мне нужно создать свою собственную привязку модели, которая распознает мои поля и привязывает их к параметрам действия, как и ожидалось? - person Robert Koritnik; 26.11.2009
comment
Так или иначе. Я пошел по пути скрытого поля. Он не меняет мои URL-адреса, и я могу сделать его максимально прозрачным. Я написал еще один метод расширения BeginSubForm(), который отображает дополнительное скрытое поле в начале, которое идентифицирует конкретную форму, выполняющую обратную передачу. - person Robert Koritnik; 08.12.2009