簡體   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