Действиям ребенка не разрешено выполнять действия перенаправления. (Использование 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!");
}

И вот мое частичное представление, оно называется _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!");
}

ИЗМЕНИТЬ EDIT EDIT EDIT:

Интересным фактом является то, что все, что я написал в моем методе Controller, и даже если я прокомментирую весь код, он все равно будет разбит на View, это означает, что он никогда не войдет в метод Controller. Я положил туда вызов в начале метода UnReadEmails, и он никогда не попадал, он всегда ломается на View!

Ответ 1

Ошибка довольно явная. Действия ребенка не могут выдавать перенаправления. Это связано с тем, что, хотя действия с дочерними элементами выглядят как обычные действия, они фактически отображаются в отдельном процессе и не могут изменять фактический ответ (для которого требуется перенаправление).

В вашем действительном коде действия для ребенка вы не возвращаете перенаправление, поэтому это означает, что для действия дочернего элемента, который отправляет перенаправление, должен быть применен фильтр действий. В частности, вам следует избегать использования таких действий, как Authorize или RequireHttps для дочерних действий, поскольку они работают с использованием перенаправлений, что опять же не может выполнять дочернее действие. Если дочернее действие находится в контроллере, который украшен Authorize, он должен быть отмечен AllowAnonymous.

Ответ 2

Обычно это происходит, когда дочернее действие имеет ошибки, так как исключение получает бросок и MVC пытается перенаправить пользователя на страницу с ошибкой. В вашем случае он пытается найти вид с именем "Ошибка, не найден!", Которого, вероятно, нет. Попробуйте запустить 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>());
}

Иногда пустой список означает, что ничего не найдено. ИЛИ:

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

Ответ 3

Привет, вы можете попробовать, изменив эту строку @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

Надеюсь, что это было полезно, любезно дайте мне знать ваши мысли или отзывы

Спасибо Картик

Ответ 4

В конце я решил пропустить мой метод PartialViewResult с контроллера и сделать это по-другому, потому что я уже потерял 2 дня, пытаясь найти ответ, и его там не было, но что-то еще работает, и именно это:

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

Что я тогда делал, я сразу же вызвал метод GetUnreadEmaisByUserId из моей части BussinesLogic, и все работало как шарм.

И что мы можем сделать здесь, чтобы улучшить это решение, следующее:

Если у нас нет "основной модели", мы могли бы сохранить это в ViewBag, вызвав это из метода MessageController/Email controller

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}