Ответ 1
Если выполняющийся запрос является POST
, он попытается найти метод RandomSponsor
принимающий HttpPost
. Если это имеет смысл, вы можете удалить HttpGet
и это должно HttpGet
.
Я хотел поставить случайное изображение на каждую страницу просмотра моего проекта mvc. Поэтому я создал метод, который возвращает partialView и вызывает этот метод на общей странице макета.
Это отлично работает, когда я пытаюсь войти с правильным именем пользователя и паролем. Используется для входа в систему, и каждая страница содержит случайное изображение. Но когда я даю неверную комбинацию имени пользователя и пароля. На общей странице макета не найден контроллер, с которым я хочу позвонить с помощью @Html.Action
, и фактическое имя входа должно быть возвращено с сообщением об ошибке "неверная комбинация имени пользователя и пароля" и, конечно же, со случайным изображением.
InnerException:
{ "Открытый метод действия RandomSponsor не найден на контроллере Project.WebUI.Controllers.HomeController '." }
Мой Html.Action в общей компоновке.
@Html.Action("RandomSponsor", "Home")
Метод в homecontroller.
[HttpGet]
[ChildActionOnly]
public ActionResult RandomSponsor()
{
var model = service.getRandomSponsor();
return PartialView("RandomSponsor", model);
}
Метод getRandomSponsor работает нормально, он всегда возвращает одно случайное строковое значение, которое возвращается в представление RandomSponsor.cshtml.
RandomSponsor.schtml(содержит только строку изображения)
<img src="~/Content/Images/Advert/@(Model)" alt="a" />
Я искал в Интернете эту проблему, но не нашел решения, кто-нибудь знает ответ на этот вопрос? Может ли это быть с HttpGet HttpPost?
С уважением.
Если выполняющийся запрос является POST
, он попытается найти метод RandomSponsor
принимающий HttpPost
. Если это имеет смысл, вы можете удалить HttpGet
и это должно HttpGet
.
Это также может произойти, если у вас много уровней вызовов, которые начинаются с POST (у меня было действие, возвращающее представление, возвращающее частичный вид, вызывающий RenderAction), тогда вызов RenderAction по-прежнему будет искать метод POST
Очень похожа на эту проблему, которая у меня была здесь - Как решить "метод публичного действия методActionName 'не найден на контроллере контроллераNameController"
И если вы хотите продолжать принимать HTTP GET-глагол и исправить проблему каскадного запроса на отправку в запрос на получение, добавьте это в свой метод
[AcceptVerbs (HttpVerbs.Get | HttpVerbs.Post)]
Имейте в виду, что [HttpGet] совпадает с [AcceptVerbs (HttpVerbs.Get)]
Получив эту ошибку, неожиданно появилось несколько разных PartialView (не всех) при настройке установки MVCForum. Мы не внесли никаких изменений в методы или взгляды на ошибки, поэтому было очень неприятно, почему они были сломаны.
После того, как вы попытались использовать другие решения на этом посту и других, вернулись к тем изменениям, которые закончились тем, что остановились на ошибках, так это то, что мы изменили привязки в IIS в другом домене, где был установлен URL-адрес "принудительного использования URL-адреса нижнего регистра" правило включено.
Когда мы отключили правило нижнего регистра, ошибки были остановлены, и сайт работал так, как предполагалось. Это не проблема перезаписи URL (я не думаю), потому что мы можем принудительно использовать www, используя ее без ошибок. Это проблема с перепиской в нижнем регистре. Не имеет значения, было ли у нас правило нижнего регистра до или после правила www.
Это решение, вероятно, не относится ко многим случаям этой ошибки, но оно сработало для нас. Надеюсь, кто-то может воспользоваться таким простым исправлением.
В моем случае та же самая проблема происходила случайно с неявным
используя (Html.BeginForm())
Изменение выше на
using (Html.BeginForm("Действие", "Контроллер", FormMethod.Post))
исправил эту проблему.
Я знаю, что это довольно старая тема, но так как это лучший результат Google, я решил добавить потенциально недостающую ссылку для MVC.Net 5.2.6.
сценарий
Я пытался вызвать дочернее действие через @Html.Action("ActionName", new { Id = 123})
и получил ошибку, очень похожую на @Html.Action("ActionName", new { Id = 123})
выше, но ни одно из других решений не сработало. Я мог нажать на действие контроллера извне (то есть HttpGet), но дочернее действие продолжало генерировать исключение и сводило меня с ума!
Решение, которое я нашел
Через некоторое время я начал играть с моими атрибутами маршрутизации. Я настроил контроллер как:
[Route("{action}")]
[RoutePrefix("Prefix")]
[RouteArea("AreaName")]
Поскольку мне нужно было только одно публичное действие - "Индекс", я удалил {action}, поместил явный атрибут маршрута в публичное действие и снова поместил свой атрибут ChildActionOnly на дочерний элемент.
После того, как я это сделал, я попал в бега и эй Presto - действие было запущено.
Возможно, стоит попробовать, если вы получаете эту ошибку при использовании атрибутной маршрутизации. Обратите внимание, что я пытался направить дочернее действие, но это не сработало.
В моем случае эта ошибка возникает, когда я отправляю на сервер поля с тегами "> <". .Net возвращает ошибку, вероятно, для защиты от внедрения SQL. Я не знаю, почему он возвращает ошибку "действие не найдено", несмотря на "небезопасный контент". Конечно, это не связано с основным вопросом, но я попал сюда, чтобы найти решение для моей проблемы, так что это может помочь кому-то еще.
Это произойдет, если запрос является POST
, но метод контроллера аннотирован [HttpGet]
. Например, вы можете создать POST
, который возвращает представление, содержащее частичные представления, вызванные с помощью @Html.Action
, с использованием методов контроллера, аннотированных с помощью [HttpGet]
. Если исходным запросом является POST
, все последующие вызванные методы контроллера должны будут поддерживать POST
.
Чтобы исправить это, вы можете использовать атрибут AcceptVerbs
, чтобы указать, что ваш метод контроллера принимает как POST
, так и GET
:
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
Вы сделали это с помощью Html.RenderAction
? Он обычно быстрее, чем Html.Action
, поскольку он напрямую взаимодействует с потоком ответов, а не строит строку.
Вы можете просмотреть следующие темы для получения дополнительной информации:
Еще одно замечание: для Html.Action
или Html.RenderAction
ваше представление не обязательно должно находиться в папке Shared, что требуется, только если вы используете Html.Partial
или Html.RenderPartial