Подтвердить что ты не робот

На контроллере не обнаружен общедоступный метод "..".. "

Я хотел поставить случайное изображение на каждую страницу просмотра моего проекта 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?

С уважением.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Имейте в виду, что [HttpGet] совпадает с [AcceptVerbs (HttpVerbs.Get)]

Ответ 3

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

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

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

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

Ответ 4

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

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

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

using (Html.BeginForm("Действие", "Контроллер", FormMethod.Post))

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

Ответ 5

Я знаю, что это довольно старая тема, но так как это лучший результат 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 - действие было запущено.

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

Ответ 6

В моем случае эта ошибка возникает, когда я отправляю на сервер поля с тегами "> <". .Net возвращает ошибку, вероятно, для защиты от внедрения SQL. Я не знаю, почему он возвращает ошибку "действие не найдено", несмотря на "небезопасный контент". Конечно, это не связано с основным вопросом, но я попал сюда, чтобы найти решение для моей проблемы, так что это может помочь кому-то еще.

Ответ 7

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

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

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

Ответ 8

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

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

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