Html.BeginForm(ASP.NET MVC)的问题
Problem with Html.BeginForm (ASP.NET MVC)
我尝试在 cshtml 文件中创建一个表单,将参数发送到一个名为“AccountController”的控制器中名为“AddNewUser”的函数。
在 SignUp.cshtml
中,我使用了 Html.BeginForm 方法,如下所示:
@using (Html.BeginForm("AddNewUser", "Account", FormMethod.Post)){
}
在 AccountContrller.cs 中我有函数 AddNewUser 其 header 是:
[HttpPost]
public ActionResult AddNewUser(SignUpViewModel model)
这是目录树,显示了两个文件的位置:目录树
这是我在 SignUp.cshtml
中的表单上按发送时得到的:错误
在目录树的图片中,突出显示名为 SignUp
的视图。但是,如果您阅读错误消息的图片,您会发现它正在寻找名为 AddNewUser
的视图。与您的控制器操作的名称相匹配:
public ActionResult AddNewUser(SignUpViewModel model)
因此,您的控制器操作可能正在尝试 return 视图。而且那个观点不存在。
您要么需要创建该视图,要么不需要 return 来自该控制器操作的视图。您可以 return 重定向到另一个操作。例如,如果您希望在发布表单后将用户重定向到 SignUp
,那么您将重定向他们:
return RedirectToAction("SignUp");
或者,您 可以 return 如果重命名控制器操作,则该视图:
[HttpPost]
public ActionResult SignUp(SignUpViewModel model)
(当然还要更新 BeginForm
调用以反映新的操作方法名称。)
这是处理表单发布的常见做法,您可能希望在出现错误时重新显示表单。只要方法签名不同,GET 和 POST 操作方法都可以具有相同的名称。 (它们应该是,因为 GET 操作没有理由接受 SignUpViewModel
。)
这样 POST 操作可以 return 视图供用户重试。表单 POST 操作的一般流程是在出现错误时 return 向用户显示视图,或者在成功时重定向用户。
您可能发现当视图名称与控制器操作名称不匹配时,您也可以明确指定视图名称:
return View("SignUp");
虽然这在技术上是允许的,但我强烈反对它,除非你真的知道你在 HTTP 操作和路由以及 RESTfulness 等方面做了什么。因为浏览器中的 URL 仍然是 AddNewUser
,不是 SignUp
。这可能会导致其他问题和奇怪的错误。
您需要在操作中设置 return 视图 url ActionResult AddNewUser
试试这个:
return View("~/Views/Account/SignUp.cshtml");
只是 return 您想要的视图。在这种情况下,试试这个:
证明注册在同一个控制器上
return View("SignUp");
否则
return View("~/Views/Account/SignUp.cshtml");
我尝试在 cshtml 文件中创建一个表单,将参数发送到一个名为“AccountController”的控制器中名为“AddNewUser”的函数。
在 SignUp.cshtml
中,我使用了 Html.BeginForm 方法,如下所示:
@using (Html.BeginForm("AddNewUser", "Account", FormMethod.Post)){
}
在 AccountContrller.cs 中我有函数 AddNewUser 其 header 是:
[HttpPost]
public ActionResult AddNewUser(SignUpViewModel model)
这是目录树,显示了两个文件的位置:目录树
这是我在 SignUp.cshtml
中的表单上按发送时得到的:错误
在目录树的图片中,突出显示名为 SignUp
的视图。但是,如果您阅读错误消息的图片,您会发现它正在寻找名为 AddNewUser
的视图。与您的控制器操作的名称相匹配:
public ActionResult AddNewUser(SignUpViewModel model)
因此,您的控制器操作可能正在尝试 return 视图。而且那个观点不存在。
您要么需要创建该视图,要么不需要 return 来自该控制器操作的视图。您可以 return 重定向到另一个操作。例如,如果您希望在发布表单后将用户重定向到 SignUp
,那么您将重定向他们:
return RedirectToAction("SignUp");
或者,您 可以 return 如果重命名控制器操作,则该视图:
[HttpPost]
public ActionResult SignUp(SignUpViewModel model)
(当然还要更新 BeginForm
调用以反映新的操作方法名称。)
这是处理表单发布的常见做法,您可能希望在出现错误时重新显示表单。只要方法签名不同,GET 和 POST 操作方法都可以具有相同的名称。 (它们应该是,因为 GET 操作没有理由接受 SignUpViewModel
。)
这样 POST 操作可以 return 视图供用户重试。表单 POST 操作的一般流程是在出现错误时 return 向用户显示视图,或者在成功时重定向用户。
您可能发现当视图名称与控制器操作名称不匹配时,您也可以明确指定视图名称:
return View("SignUp");
虽然这在技术上是允许的,但我强烈反对它,除非你真的知道你在 HTTP 操作和路由以及 RESTfulness 等方面做了什么。因为浏览器中的 URL 仍然是 AddNewUser
,不是 SignUp
。这可能会导致其他问题和奇怪的错误。
您需要在操作中设置 return 视图 url ActionResult AddNewUser
试试这个:
return View("~/Views/Account/SignUp.cshtml");
只是 return 您想要的视图。在这种情况下,试试这个:
证明注册在同一个控制器上
return View("SignUp");
否则
return View("~/Views/Account/SignUp.cshtml");