#c# #html #asp.net #asp.net-mvc #html.beginform
Вопрос:
Я попытался создать форму в файле cshtml, отправляющую параметры функции под названием «AddNewUser» внутри контроллера, который я назвал «AccountController».
Внутри SignUp.cshtml
Я использовал метод Html.BeginForm примерно так:
@using (Html.BeginForm("AddNewUser", "Account", FormMethod.Post)){
}
Внутри AccountContrller.cs у меня есть функция AddNewUser, заголовок которой:
[HttpPost]
public ActionResult AddNewUser(SignUpViewModel model)
Вот дерево каталогов, показывающее расположение обоих файлов: дерево каталогов
И вот что я получаю, когда нажимаю «Отправить» в форме SignUp.cshtml
: Ошибка
Комментарии:
1. Пожалуйста, проверьте
AddNewUser
метод возврата()
Ответ №1:
На картинке вашего дерева каталогов вы выделяете представление под названием SignUp
. Но если вы прочтете изображение вашего сообщения об ошибке, вы увидите, что оно ищет представление под названием AddNewUser
. Который соответствует названию вашего действия контроллера:
public ActionResult AddNewUser(SignUpViewModel model)
Поэтому, по-видимому, ваше действие контроллера пытается вернуть представление. И такой точки зрения не существует.
Вам либо нужно будет создать это представление, либо не возвращайте представление из этого действия контроллера. Вместо этого вы можете вернуть перенаправление на другое действие. Например, если вы хотите, чтобы пользователь был перенаправлен SignUp
после публикации формы, вы бы перенаправили его:
return RedirectToAction("SignUp");
Кроме того, вы можете вернуть это представление, если переименуете действие контроллера:
[HttpPost]
public ActionResult SignUp(SignUpViewModel model)
(И, конечно, обновите BeginForm
вызов, чтобы отразить новое имя метода действия.)
Это обычная практика для обработки сообщений в формах, в которых вам может потребоваться повторно отобразить форму в случае ошибки. Методы действия GET и POST могут иметь одно и то же имя, если сигнатуры методов различны. (Что и должно быть, поскольку у действия GET не было бы причин принимать a SignUpViewModel
.)
Таким образом, действие POST может вернуть представление, чтобы пользователь мог повторить попытку. Общий поток для действия отправки формы будет заключаться в том, чтобы вернуть представление пользователю в случае ошибки или перенаправить пользователя в случае успеха.
Возможно, вы обнаружите, что также можете явно указать имя представления, если оно не совпадает с именем действия контроллера:
return View("SignUp");
Хотя технически это разрешено, я настоятельно не рекомендую это делать, если вы действительно не знаете, что делаете с точки зрения действий HTTP, маршрутов, спокойствия и т. Д. Потому что URL-адрес в браузере все равно был AddNewUser
бы , нет SignUp
. Это может вызвать другие проблемы и странные ошибки в будущем.
Комментарии:
1. Я попробовал второй вариант, который вы предложили, и это помогло! Спасибо!
Ответ №2:
вам нужно установить URL-адрес для просмотра возврата в своем действии ActionResult AddNewUser
, попробуйте это:
return View("~/Views/Account/SignUp.cshtml");
Комментарии:
1.Обратите внимание, что результирующий URL-адрес в браузере все равно будет
AddNewUser
и неSignUp
будет. Это может вызвать другие проблемы ниже по течению. Предпочтительным подходом является перенаправление пользователя или переименование действия контроллера в соответствии с предполагаемым представлением.
Ответ №3:
просто верните вид, который вы хотите. в этом случае попробуйте следующее:
подтвердите, что регистрация осуществляется на том же контроллере
return View("SignUp");
Иначе
return View("~/Views/Account/SignUp.cshtml");