Проверка нескольких форм MVC 3 - PullRequest
1 голос
/ 20 ноября 2011

Прочитав В 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" />
}
  1. Представление верхнего уровня выполняет RenderAction
  2. Контроллер ChildAction выполняет
  3. Представление верхнего уровня выполняет RenderAction длявторой редактор
  4. Выполнение контроллера ChildAction
  5. Я заполняю неверное значение в одной из форм и отправляю
  6. Метод действия HttpPost выбирает его, добавляет сообщение об ошибке и пытаетсяВизуализация представления верхнего уровня с той же моделью
  7. Представление верхнего уровня выполняет RenderAction
  8. Метод действия HttpPost снова его поднимает (по словам Рика Перри, "...")

И результатом является исключение переполнения стека, поскольку View("Editor") повторно вводит метод действия Editor(Model) с RenderAction, который предупреждает о слиянии RouteValues.

Мой вопрос, конечно, заключается в том, что изменить / вставить, в зависимости от того, что и где (в контроллере, глупо), чтобы предотвратить переполнение.

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