ASP .NET MVC 4 View, содержащий два частичных View с формой в каждом

В моем приложении MVC 4 у меня есть представление индекса. В этом представлении у меня есть два тега div, где отображается частичное представление. Есть две кнопки, которые при нажатии переключаются между этими двумя элементами div с помощью jQuery. Частичные виды строго типизированы для каждой модели.

Вопрос:

Как передать модели частичным видам? Как мне обрабатывать запросы POST из частичных представлений? В методе (ах) действия POST, если ModelState недействителен, как мне повторно отобразить представление, которое знает о ModelStae?

Частичные взгляды - путь в этом сценарии? Есть ли лучшие способы достичь этого с MVC 4?

Любая помощь приветствуется.

Вот что я пытался без успеха:

Index.cshtml

<div id="token">
   <!-- insert Token based PartialView -->
@{
    //Html.RenderPartial("_TokenPartial");
    Html.RenderAction("TokenBased");
}

<div id="credentials">
  <!-- insert Credentials based PartialView -->
@{
   //Html.RenderPartial("_CredentialPartial");
   Html.RenderAction("CredentialsBased");
}
</div>

Я пробовал с HTML.RenderPartial("_partial") но не удалось указать модель, на которой основан частичный вид. Тогда я попробовал с Html.RenderAction("TokenBased") и в этом действии возвращает частичное представление с экземпляром модели для этого представления:

CredentialController.cs

    public ActionResult TokenBased(string token)
    {
        ...

        return View("_TokenPartial", new TokenModel);
    }

И вот частичный вид:

TokenPartial.cshtml

    @model TokenModel

    @using (Html.BeginForm("CreateAgreementToken", "Credential"))
    {
        <div class="formscontent">
            @Html.LabelFor(x => x.Token) <br />
            @Html.TextBoxFor(x => x.Token, new {size = "44" })
            @Html.ValidationMessageFor(x => x.Token)
            <br />
            <br />

            @Html.LabelFor(x => x.Email) <br />
            @Html.TextBoxFor(x => x.Email, new {size = "30" })
            @Html.ValidationMessageFor(x => x.Email)
            <br />
            <br />

            @Html.CheckBoxFor(x => x.AcceptSubsTerms, new { value = "SubsTerms"})
            @Html.LabelFor(x => x.AcceptSubsTerms)
            @Html.ValidationMessageFor(x => x.AcceptSubsTerms)
            @Html.ActionLink("SubsTermsLinkText", "Subscription", null, new {target = "_blank"})
            <br />
            <br />
        </div>
        <br />

        <input class="mainbutton" type="submit" value="CreateAgreement_btn_txt"/><br />

    }

И вот метод действия POST:

    [HttpPost]
    public ActionResult CreateAgreementToken(TokenModel model)
    {

        if (ModelState.IsValid)
        {
            // Create Agreement
            //
            //

            return RedirectToAction("Welcome");
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user credentials provided are incorrect.");

        // Where to redirect to.
        // How to re-render the Index view that's aware of the ModelState errors

        return RedirectToAction("Index");
    }

Как обрабатывать взаимодействия между методами действия Controller, индексным представлением и частичным представлением, как в "обычном" случае, когда у вас есть метод действия Index, визуализирующий индексное представление, передавая ему экземпляр модели. А затем в методе действия Index POST, если проверка не удалась, вы повторно отображаете форму, вызывая представление Index, передавая ему недопустимую модель.

Спасибо

1 ответ

Решение

Чтобы передать модель в частичное, вы делаете это с помощью @Html.Partial("SomeFile", SomeModel);

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

Частичные являются просто способом организации HTML. У них нет контекста после рендеринга страницы, поэтому меня это не слишком беспокоит.

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

Другие вопросы по тегам