不允许子操作执行重定向操作。 (使用PartialViews)

我正在尝试使用数据库中的一些数据加载我的部分视图,但是当我运行应用程序时,我遇到了以下问题:

不允许子操作执行重定向操作。

我不知道为什么会这样,因为我对MVC技术很新。

这是控制器中的PartialViewResult方法:

 public PartialViewResult UnReadEmails() { if (User.Id != null) { List resultList = EmailController.GetUnreadEmailsByUserId(User.Id); return PartialView("~/Views/Emails/_UnReadEmails.cshtml", resultList); } return PartialView("Error, not found!"); } 

这是我的部分视图本身,它被称为_UnReadEmails(你可以看到我在这里显示有关发件人和电子邮件正文的信息),PartialView正在检索我从我的控制器发送的电子邮件列表

 @model IEnumerable foreach (var item in Model) { 
  • @item.EmailSender
  • }

    在我尝试以这种方式加载我的局部视图后:

    @Html.Action("UnreadEmails", "Message")

    我开始收到我在标题中提到的以下问题,

    我已经尝试过几件事来解决这个问题,例如将@Html.Action("UnreadEmails", "Message")更改为@Url.Action("UnreadEmails", "Message")等等,但这并没有解决我的问题。

    编辑:它总是打破这一行(在视图上):

    @Html.Action("UnreadEmails", "Message")

    它永远不会进入代码背后.. 在此处输入图像描述

    在Chris建议之后,我在方法的顶部添加了[AllowAnonymous]

     [AllowAnonymous] public PartialViewResult UnReadEmails() { if (User.Id != null) { List resultList = EmailController.GetUnreadEmailsByUserId(User.Id); return PartialView("~/Views/Emails/_UnReadEmails.cshtml", resultList); } return PartialView("Error, not found!"); } 

    编辑编辑编辑:

    有趣的事实是,无论我在Controller的方法中写什么,即使我评论所有代码,它仍然会在View上中断,这意味着它永远不会进入Controller的方法。 我在UnReadEmails方法的开头就把它打破了,它从来没有被击中,它总是打破一个视图!

    错误非常明确。 子操作无法发出重定向。 这是因为,虽然子操作看起来像常规操作,但实际上它们是在单独的进程中呈现的,并且无法修改实际响应(重定向需要这样做)。

    在实际的子操作代码中,您没有返回重定向,因此这意味着您必须将一个操作filter应用于发出重定向的子操作。 特别是,您应该避免在子操作上使用AuthorizeRequireHttps类的东西,因为这些操作通过使用重定向,而子操作也无法做到。 如果子操作位于使用Authorize修饰的控制器中,则应使用AllowAnonymous标记。

    通常它发生在子Action有错误时,因为exception被抛出并且MVC尝试将用户重定向到错误页面。 在你的情况下,它试图找到名为“错误,未找到!”的视图,这可能是你没有的。 首先尝试将Action作为自身运行,并检查逻辑是否有效。 然后将您的视图_UnreadEmails.cshtml放在Manage Controller Views文件夹中,并修改代码:

     public PartialViewResult UnReadEmails() { if (User.Id != null) { List resultList = EmailController.GetUnreadEmailsByUserId(User.Id); return PartialView("_UnReadEmails", resultList); } return PartialView("_UnReadEmails" new List()); } 

    有时空List表示没有找到任何内容。 要么:

     public ActionResult UnReadEmails() { if (User.Id != null) { List resultList = EmailController.GetUnreadEmailsByUserId(User.Id); return PartialView("_UnReadEmails", resultList); } return Content("Error, not found!"); } 

    嗨,您可以尝试通过更改此行@Html.Action("UnreadEmails", "Message")来像这样@{Html.Action("Category","Home");}

    如果上面的方法不起作用,还有其他三种方法可以在mvc中渲染局部视图。 那些是

     Html.RenderPartial Html.RenderAction Html.Partial 

    您可以使用上述任何一种方法并获得解决方案。

    比较的好例子可以在这里找到: http : //www.dotnettricks.com/learn/mvc/renderpartial-vs-renderaction-vs-partial-vs-action-in-mvc-razor

    希望它有用,请让我知道你的想法或反馈

    谢谢Karthik

    最后,我决定从控制器中跳过我的PartialViewResult方法并以另一种方式执行,因为我已经失去了2天试图找到答案但它不存在,但其他东西似乎正在起作用,并且它是这样的:

     {@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml",EmailController.GetUnreadEmailsByUserId(User.Id))} 

    我接下来做了什么,我从BussinesLogic部分直接调用了GetUnreadEmaisByUserId方法,一切都像魅力一样。

    我们可以做些什么来使这个解决方案更好:下一步:

    如果我们没有“主模型”,我们可以将它存储在ViewBag中,从MessageController / Email控制器方法调用它

     ViewBag.lstUnreadEmail‌s = E‌​mailController.Get‌‌​​Un‌​readEmailsByUserId(U‌​ser.Id); And in the View use this {@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml",ViewBag.lstUnreadEmail‌​s}