Действиям ребенка не разрешено выполнять действия перенаправления. (Использование 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.lstUnreadEmails = EmailController.GetUnreadEmailsByUserId(User.Id);
And in the View use this
{@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml",ViewBag.lstUnreadEmails}