![](/img/trans.png)
[英]doesn't work redirecttoaction in partial view controller.(Error - Child actions are not allowed to perform redirect actions.)
[英]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上中断!
该错误非常明显。 子操作不能发出重定向。 这是因为,尽管子操作看起来像常规操作,但实际上它们是在单独的过程中呈现的,并且无法修改实际响应(重定向将需要该响应)。
在实际的子操作代码中,您没有返回重定向,因此这意味着您必须将操作过滤器应用于发出重定向的子操作。 特别是,您应该避免对子操作使用诸如Authorize
或RequireHttps
类的东西,因为这些操作通过使用重定向来工作,而这又是子操作无法做到的。 如果子操作位于以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.lstUnreadEmails = EmailController.GetUnreadEmailsByUserId(User.Id);
And in the View use this
{@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml",ViewBag.lstUnreadEmails}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.