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

时间:2017-05-31 14:54:55

标签: c# asp.net-mvc razor view controller

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

  

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

我不知道为什么会这样,因为我对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!");
}

这是我的部分视图本身,它被称为_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")

它永远不会进入代码...... enter image description here

在Chris建议之后,我在方法的顶部添加了[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方法开始的时候把它打破了,它从来没有被击中,它总是打破了View!

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

有时空列表表示没有找到任何内容。 OR:

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

答案 2 :(得分:0)

您好,您可以尝试将此行@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

答案 3 :(得分:0)

最后我决定从控制器跳过我的PartialViewResult方法并以另一种方式进行,因为我已经失去了2天试图找到答案而且它不在那里,但还有别的东西似乎工作正常,就是这样:

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

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

接下来我们可以做些什么来改善这个解决方案:

如果我们没有&#34;主要型号&#34;我们可以将它存储在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}