2014-09-12 49 views
1

我在我的应用程序有一个LogInOrRegister页,调用2个儿童行动 LogInOrRegister.cshtmlMVC4 PartialViewResult返回一个视图,而不是PartialView

@{ 
    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") 
} 

的登录PartialView是:

@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); 
    } 

I看到正确的2局部视图我GET页面LogInOrRegister.cshtml

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

任何想法?

回答

1

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

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

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

@using (Html.BeginForm()) 

PartialView呈现在其容器中。此外,我们可以定义POST行动ChildActionOnly,它仍然可以工作:

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

如果任何修复它,我不知道如何。除了添加'ChildActionOnly'可以防止这个特定的'Login'操作被调用。你有另外一个实际返回'ViewResult'的'Login'操作吗?总而言之,如果您的操作返回“PartialViewResult”,那么您将获得的是部分视图,即无布局。获得布局的唯一方法是返回'ViewResult'。 – 2014-09-12 18:18:52

+0

另外,请记住,您不能发布到儿童行动。 – 2014-09-12 18:20:47

1

所以如果你看看在这里找到的讨论https://stackoverflow.com/a/10253786/30850你会看到ChildActionOnlyAttribute被使用,以便一个Action可以在视图内呈现,但不能被提供给浏览器。

+0

你知道为什么当我移除ChildActionOnly属性时,当调用返回的PartialView()时,我得到了没有布局的局部视图? – 2014-09-12 16:32:42

+0

我会更新我的问题,然后... – 2014-09-12 16:37:39

+0

部分视图应该返回一个没有布局的局部视图。如果你想要的布局,你只需返回一个视图 – 2014-09-16 23:06:41

0

如果返回类型为PartialViewResult,在方法public PartialViewResult Login(LoginModel model, string returnUrl)与模型一起指定以其它方式使用ActionResult作为返回类型partialview名。 ActionResult是一个抽象类,其中PartialViewResult是一个子类。

相关问题