【问题标题】:MVC4 PartialViewResult return a view and not a PartialViewMVC4 PartialViewResult 返回视图而不是 PartialView
【发布时间】:2014-11-06 21:16:01
【问题描述】:

我的应用程序中有一个 LogInOrRegister 页面,它调用 2 个子操作 登录或注册.cshtml

@{
    ViewBag.Title = "Log in";
}

@Html.Action("Login", "Account", new { returlUrl = ViewBag.ReturnUrl})
@Html.Action("Register", new { returlUrl = ViewBag.ReturnUrl})

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

登录部分视图是:

@model Com.WTS.Portal.Models.LoginModel
<hgroup class="title">
    <h1>@ViewBag.Title</h1>
</hgroup>

<section id="loginForm">
<h2>Use a local account to log in.</h2>
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
    <legend>Log in Form</legend>
    <ol>
        <li>
            @Html.LabelFor(m => m.Email)
            @Html.TextBoxFor(m => m.Email)
            @Html.ValidationMessageFor(m => m.Email)
        </li>
        <li>
            @Html.LabelFor(m => m.Password)
            @Html.PasswordFor(m => m.Password)
            @Html.ValidationMessageFor(m => m.Password)
        </li>
        <li>
            @Html.CheckBoxFor(m => m.RememberMe)
            @Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
        </li>
    </ol>
    <input type="submit" value="Log in" />
    </fieldset>
}
</section>

我的 AccountController.cs 包含以下代码:

    [AllowAnonymous]
    public PartialViewResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return PartialView();
    }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public PartialViewResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.Email, model.Password, persistCookie: model.RememberMe))
        {
            RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return PartialView(model);
    }

我正确地看到了我获取页面 LogInOrRegister.cshtml 的 2 部分视图

当我提交表单时,如果表单中存在验证错误,则会显示视图(无布局)而不是应该作为 LogInOrRegster 一部分的部分视图

有什么想法吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 viewresult


    【解决方案1】:

    因此,如果您查看有关在此处找到的讨论 https://stackoverflow.com/a/10253786/30850,您会看到使用了 ChildActionOnlyAttribute 以便可以在视图内呈现 Action,但不能将其提供给浏览器。

    【讨论】:

    • 你知道为什么当我删除 ChildActionOnly 属性时,当调用 return PartialView() 时,我得到没有布局的局部视图吗?
    • PartialView 应该返回一个没有布局的局部视图。如果你想要布局,你只需返回一个 View
    【解决方案2】:

    好的,我找到了解决方案。通过将路由参数传递给局部视图表单:

    @using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
    

    我认为我们改变了子动作的行为。仅通过删除路由属性:

    @using (Html.BeginForm())
    

    PartialView 在其容器中呈现。此外,我们可以将 POST 操作定义为 ChildActionOnly,它仍然有效:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    [ChildActionOnly]
    public PartialViewResult Login(LoginModel model, string returnUrl)
    

    【讨论】:

    • 如果有任何修复它,我不确定如何。除了可能添加 ChildActionOnly 会阻止调用此特定的 Login 操作。您是否还有另一个实际上返回ViewResultLogin 操作?总而言之,如果您的操作返回 PartialViewResult,那么您将获得的只是局部视图,即没有布局。获得布局的唯一方法是返回ViewResult
    【解决方案3】:

    如果返回类型为PartialViewResult,则在方法public PartialViewResult Login(LoginModel model, string returnUrl) 中指定部分视图名称和模型,否则使用ActionResult 作为返回类型。ActionResult 是一个抽象类,而PartialViewResult 是一个子类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多