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. У них нет контекста после рендеринга страницы, поэтому меня это не слишком беспокоит.
Чтобы ваш взгляд знал об ошибках в состоянии вашей модели, вам нужно передать его модели. Вместо перенаправления на индекс верните индексное представление и передайте модель в качестве второго параметра.