繁体   English   中英

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

[英]Child actions are not allowed to perform redirect actions. (Using PartialViews)

我正在尝试使用数据库中的一些数据加载我的局部视图,但是运行该应用程序时出现以下问题:

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

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

这是控制器中的PartialViewResult方法:

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

这是我的partialview本身,它称为_UnReadEmails(如您所见,我在这里显示有关发件人和电子邮件正文的信息),PartialView正在检索从控制器发送到的电子邮件列表

@model IEnumerable<Emails>

foreach (var item in Model)
{
    <li>
        <a>
            <span>
               <span>@item.EmailSender</span>
               <span class="email">
                     @item.Body;
               </span>
        </a>
    </li>
}

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

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

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

我已经尝试了一些方法来解决此问题,例如将@Html.Action("UnreadEmails", "Message")更改为@Url.Action("UnreadEmails", "Message")等,但这并不能解决我的问题。

编辑:它总是在此行中断(在视图上):

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

它永远不会成为代码的背后。 在此处输入图片说明

在克里斯建议之后,我在方法顶部添加了[AllowAnonymous]

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

编辑编辑编辑:

有趣的事实是,无论我在Controller方法中编写的内容如何,​​即使我注释了所有代码,它仍然会在View上中断,这意味着它将永远不会进入Controller方法中。 我在UnReadEmails方法的开始处放置了breakpoing,但是它从未被使用过,它始终在View上中断!

该错误非常明显。 子操作不能发出重定向。 这是因为,尽管子操作看起来像常规操作,但实际上它们是在单独的过程中呈现的,并且无法修改实际响应(重定向将需要该响应)。

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

通常,它会在子Action发生错误时发生,因为会引发异常,并且MVC会尝试将用户重定向到错误页面。 在您的情况下,它试图查找名为“错误,未找到!”的视图,而您可能没有。 首先尝试以本身的方式运行Action,然后检查逻辑是否有效。 然后将视图_UnreadEmails.cshtml放入“管理控制器视图”文件夹中,并修改代码:

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

有时,空列表意味着什么也没找到。 要么:

public ActionResult UnReadEmails()
{
   if (User.Id != null)
   {
      List<Emails> 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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM