[英]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.