Прочитав В ASP.NET MVC3, как следует рендерить несколько PartialViews, поддерживаемых несколькими моделями? и некоторые другие, я до сих пор не знаю лучшего способа проверки нескольких частичных представлений.--forms - модели на странице.
Я не сомневаюсь, что все, что заставляет меня думать о них как о тройках, сейчас является проблемой.Все, что я прошу, это то, что «почему» - это комментарии, а ответы - это ответы.
У меня есть представление «Редактор», которое выполняет несколько действий рендеринга, которые предварительно заполняют некоторые формы:
@{
Html.RenderAction("EditName", new { name = Url.RequestContext.RouteData.Values["ID"]});
}
@{
//returns EditColor partial view prefilled with this widget's color's properties
Html.RenderAction("EditColor", new { name = Url.RequestContext.RouteData.Values["ID"]});
}
Итак, у меня есть EditColorFormModel, который имеет что-то вроде (так как я не хочу экстравагантных названий цветов) ...
[StringLength(8)]
public String Name
{
get;
set;
}
И у меня есть действие POST, чтобы принять отправку EditColorForm с чем-то вроде ...
if (!ModelState.IsValid)
{
return View("Editor", EditColorFormModel);
}
Но если это так, я получаю переполнение стека.Я предполагаю, что это потому, что эта модель использует RenderAction для запуска цикла.Я попытался RedirectToAction("Editor", EditColorFormModel)
, но сообщения проверки не попадают в помощник по сводкам при частичном представлении EditColor, которое, как я предполагаю, заключается в том, что модель все равно не выполняет действие RenderAction.Так или нет, и что мне делать?
Мой собственный ответ: я не задал правильный вопрос и мне нужен полный изолированный пример проблемы,Я оставил модель, потому что там нет логики, у нее есть некоторые свойства с примененными атрибутами проверки.
Контроллер:
[ChildActionOnly]
public PartialViewResult ColorEditor(Int32 WidgetId)
{
return PartialView(new Models.WidgetColorModel() {
Id = WidgetId
//prefill whatever else on form
});
}
[ChildActionOnly]
public PartialViewResult DimensionEditor(Int32 WidgetId)
{
//same for dim
}
[HttpPost]
public ActionResult ColorEditor(Models.WidgetColorModel m)
{
if (ModelState.IsValid)
{
return RedirectToAction("Index");
}
else
{
ModelState.AddModelError("", "Something not Kosher-colored in Denmark");
return View("Editor", m);
}
}
[HttpPost]
public ActionResult DimensionEditor(Models.WidgetDimensionModel m)
{
//same for dim
}
Представление:
<body>
<div>
@{
Html.RenderAction("ColorEditor", new { WidgetId = Context.Request.Params["WidgetId"]});
Html.RenderAction("DimensionEditor", new { WidgetId = Context.Request.Params["WidgetId"]});
}
</div>
</body>
Частичные представления(DimensionEditor структурирован точно так же):
@model MvcApplication2.Models.WidgetColorModel
@using (Html.BeginForm("ColorEditor","Home", FormMethod.Post))
{
@Html.ValidationSummary()
<span>Specialized color editor for Widget @Model.Id</span>
@Html.EditorForModel()
<input type=submit name= "ColSubmit" value="Sumbit" />
}
- Представление верхнего уровня выполняет RenderAction
- Контроллер ChildAction выполняет
- Представление верхнего уровня выполняет RenderAction длявторой редактор
- Выполнение контроллера ChildAction
- Я заполняю неверное значение в одной из форм и отправляю
- Метод действия HttpPost выбирает его, добавляет сообщение об ошибке и пытаетсяВизуализация представления верхнего уровня с той же моделью
- Представление верхнего уровня выполняет RenderAction
- Метод действия HttpPost снова его поднимает (по словам Рика Перри, "...")
И результатом является исключение переполнения стека, поскольку View("Editor")
повторно вводит метод действия Editor(Model)
с RenderAction
, который предупреждает о слиянии RouteValues.
Мой вопрос, конечно, заключается в том, что изменить / вставить, в зависимости от того, что и где (в контроллере, глупо), чтобы предотвратить переполнение.