Метод открытого действия ".." не найден на контроллере ".."

Я хотел разместить случайное изображение на каждой странице просмотра моего проекта mvc. Итак, я создал метод, который возвращает partialView и вызывает этот метод на общей странице макета.

Это нормально работает, когда я пытаюсь войти в систему с правильным именем пользователя и паролем. Используемый входит в систему, и каждая страница содержит случайное изображение. Но когда я даю неверную комбинацию логина и пароля. Страница общего макета не находит контроллер, который я хочу вызвать с моим @Html.Action, и на самом деле представление входа в систему должно возвращаться с сообщением об ошибке «недопустимая комбинация имени пользователя и пароля» и, конечно же, со случайным изображением.

InnerException:

{"Открытый метод действия 'RandomSponsor' не найден на контроллере 'Project.WebUI.Controllers.HomeController'."}

My Html.Action в общем макете.

@Html.Action("RandomSponsor", "Home")

Метод в домашнем контроллере.

    [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?

С Уважением.


person Gijs    schedule 05.06.2013    source источник
comment
вы можете опубликовать свое определение таблицы маршрутов? (RegisterRoutes в global.asax), а также определение контроллера, у которого есть действие RandomSponsor ().   -  person Pierluc SS    schedule 05.06.2013
comment
Я обнаружил ошибку для этого aspnetwebstack.codeplex.com/workitem/2295   -  person Chris Marisic    schedule 24.02.2016
comment
Я получал ту же ошибку при использовании Mozilla Firefox 45. Проделав то же самое с Google Chrome 48.0.2564.116 m, проблема исчезла. В моем случае задействован некоторый JavaScript, и я подозреваю, что это проблема.   -  person JayJay    schedule 11.03.2016


Ответы (8)


Если выполняется запрос POST, он попытается найти метод RandomSponsor, принимающий HttpPost. Если это имеет смысл, вы можете удалить HttpGet, и это должно помочь.

person Claudio Redi    schedule 05.06.2013
comment
Хорошо, я видел это, и сначала это не зарегистрировалось; если у вас много уровней вызовов, которые начинаются с POST (у меня было действие, возвращающее представление, возвращающее частичное представление, вызывающее RenderAction), тогда вызов RenderAction будет по-прежнему выглядеть для метода POST. Надеюсь, это помешает кому-то другому потратить на это четыре часа :) - person Marcel Popescu; 24.01.2014
comment
Как решить эту проблему, не удаляя атрибут [HttpGet]? Я хочу отправлять значения маршрута в метод GET, а не POST. - person pt12lol; 27.01.2014
comment
О, я нашел решение. Просмотр был вызван POST, и это исключило загрузку @Html.Action() GET. - person pt12lol; 27.01.2014
comment
@MarcelPopescu Спасибо - person FindOutIslamNow; 09.05.2018

Это также может произойти, если у вас есть много уровней вызовов, которые начинаются с POST (у меня было действие, возвращающее представление, возвращающее частичное представление, вызывающее RenderAction), тогда вызов RenderAction все равно будет искать метод POST

Очень похоже на эту проблему, которая у меня была здесь - Как решить проблему с методом открытого действия 'methodActionName' не был найден на контроллере 'controllerNameController'

И если вы хотите продолжить принимать команду HTTP GET и исправить проблему каскадного пост-запроса в запросе получения, добавьте это в свой метод

[AcceptVerbs (HttpVerbs.Get | HttpVerbs.Post)]

Помните, что [HttpGet] - это то же самое, что [AcceptVerbs (HttpVerbs.Get)].

person Mauricio Gracia Gutierrez    schedule 07.01.2016

Это произойдет, если запрос POST, но метод контроллера аннотирован [HttpGet]. Например, вы можете выдать POST, который возвращает представление, содержащее частичные представления, вызываемые с @Html.Action, с использованием методов контроллера, аннотированных [HttpGet]. Если исходный запрос - POST, все вызываемые впоследствии методы контроллера должны будут поддерживать POST.

Чтобы исправить это, вы можете использовать атрибут AcceptVerbs, чтобы указать, что ваш метод контроллера принимает как POST, так и GET:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
person Owen Pauling    schedule 29.07.2019

Получил эту ошибку внезапно на нескольких разных PartialView (не на всех) при настройке установки MVCForum. Мы не вносили никаких изменений в методы или представления, касающиеся ошибок, поэтому было очень неприятно, почему они не работают.

Попробовав другие решения в этом сообщении и других, вернулся к внесенным изменениям, и что в конечном итоге остановило ошибки, так это то, что мы изменили привязки в IIS к другому домену, в котором было включено правило перезаписи URL-адреса `` принудительный URL-адрес в нижнем регистре ''.

Когда мы отключили правило принудительного нижнего регистра, ошибки прекратились, и сайт работал так, как должен. Это не проблема перезаписи URL (я не думаю), потому что мы можем принудительно использовать www без ошибок. Это проблема перезаписи строчными буквами. Не имело значения, было ли у нас правило нижнего регистра до или после правила www.

Это решение, вероятно, не применимо ко многим случаям этой ошибки, но у нас оно сработало. Надеюсь, кому-то еще пригодится такое простое исправление.

person swimex    schedule 27.11.2017

Я просто решил эту проблему как ни странно на моем локальном ПК, убедившись, что весь мой путь запроса был в нижнем регистре. Так что попробуйте.

person Greg Quinn    schedule 28.07.2020

В моем случае такая же проблема возникала случайным образом с неявным

используя (Html.BeginForm ())

Изменение выше на

используя (Html.BeginForm ("Действие", "Контроллер", FormMethod.Post))

исправил эту проблему.

person tomekole    schedule 28.05.2018
comment
Изменилось и все еще происходит случайно - person FindOutIslamNow; 24.10.2018

Я знаю, что это довольно старый поток, но, поскольку это лучший результат Google, я подумал, что добавлю потенциально отсутствующую ссылку для MVC.Net 5.2.6.

Сценарий

Я пытался вызвать дочернее действие через @Html.Action("ActionName", new { Id = 123}) и получил ошибку, похожую на приведенную выше, но ни одно из других решений не помогло. Я мог воздействовать на действие контроллера извне (например, HttpGet), но дочернее действие продолжало генерировать исключение и сводило меня с ума!

Решение, которое я нашел

Через некоторое время я начал играть со своими атрибутами маршрутизации. Я настроил контроллер как:

[Route("{action}")]
[RoutePrefix("Prefix")]
[RouteArea("AreaName")]

Поскольку мне было нужно только одно общедоступное действие, «Индекс», я удалил {действие}, поместил явный атрибут маршрута в общедоступное действие и вернул свой атрибут ChildActionOnly дочернему элементу.

После того, как я сделал это, я пустился в бега, и эй, готово - действие было успешным.

Возможно, стоит попробовать, если вы получаете эту ошибку при использовании маршрутизации атрибутов. Обратите внимание, что я пытался маршрутизировать дочернее действие, но это не сработало.

person Mike C    schedule 08.01.2019

Вы попробовали с Html.RenderAction? Обычно он быстрее, чем Html.Action, поскольку взаимодействует напрямую с потоком ответа, а не строит строку.

Вы можете просмотреть следующие темы для получения дополнительной информации:

Также следует отметить, что для Html.Action или Html.RenderAction ваше представление не обязательно должно находиться в папке Shared, это требуется только в том случае, если вы используете Html.Partial или Html.RenderPartial

person Pierluc SS    schedule 05.06.2013
comment
Html.Partial и Html.RenderPartial также не обязательно должны находиться в общей папке. Если он находится в той же папке, что и вызывающее его представление, вы можете ссылаться на него напрямую. Вы также можете использовать полный путь к просмотру, например ~/Views/MyFolder/_Partial.cshtml - person Carl; 23.05.2019