4

在我的 MVC 4 应用程序中,我有一个索引视图。在这个视图中,我有两个 div 标签,其中呈现了部分视图。有两个按钮在单击时使用 jQuery 在这两个 div 之间切换。Partial Views 是强类型的,每个都有它的模型。

问题:

如何将模型传递给局部视图?如何处理来自部分视图的 POST 请求?在 POST 操作方法中,如果 ModelState 无效,我如何重新渲染知道 ModelStae 的视图?

在这种情况下,部分视图是要走的路吗?使用 MVC 4 是否有更好的方法来实现这一点?

任何帮助表示赞赏。

这是我尝试过的但没有成功的方法:

索引.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")并在此操作中返回带有此视图模型实例的部分视图:

凭据控制器.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");
    }

如何处理控制器操作方法、索引视图和部分视图之间的交互,就像在“正常”情况下,您有一个索引操作方法渲染一个索引视图,并将其传递一个模型实例。然后在 Index POST 操作方法中,如果验证失败,则通过调用 Index 视图将无效模型传递给它来重新显示表单。

谢谢

4

1 回答 1

3

要将模型传递给局部模型,您可以使用 @Html.Partial("SomeFile", SomeModel);

如果您有多个表单,我会建议您为它们提供每个不同的控制器操作。您可以使用@Html.BeginForm 指定控制器和操作参数。

部分只是组织html的一种方式。一旦页面被渲染,它们就没有上下文,所以我不会太担心这一点。

为了让您的视图了解模型状态中的错误,您需要将模型传递给它。而不是重定向到索引返回索引视图并将模型作为第二个参数传递。

于 2013-01-16T14:38:07.070 回答