c# - Html.BeginForm (ASP.NET MVC) 的问题
问题描述
我试图在一个 cshtml 文件中创建一个表单,将参数发送到我命名为“AccountController”的控制器内的一个名为“AddNewUser”的函数。
在里面SignUp.cshtml
我使用了 Html.BeginForm 方法,如下所示:
@using (Html.BeginForm("AddNewUser", "Account", FormMethod.Post)){
}
在 AccountContrller.cs 我有函数 AddNewUser 其标题是:
[HttpPost]
public ActionResult AddNewUser(SignUpViewModel model)
这是目录树,显示了两个文件的位置: 目录树
这是我在表单上按发送时得到的SignUp.cshtml
:错误
解决方案
在目录树的图片中,您突出显示了一个名为SignUp
. 但是,如果您阅读错误消息的图片,您会发现它正在寻找一个名为AddNewUser
. 与您的控制器操作的名称匹配:
public ActionResult AddNewUser(SignUpViewModel model)
所以大概你的控制器动作是试图返回一个视图。而这种观点是不存在的。
您要么需要创建该视图,要么不从该控制器操作返回视图。您可以改为将重定向返回到另一个操作。例如,如果您希望用户SignUp
在表单发布后被重定向到,那么您将重定向他们:
return RedirectToAction("SignUp");
或者,如果您重命名控制器操作,则可以返回该视图:
[HttpPost]
public ActionResult SignUp(SignUpViewModel model)
(当然还要更新BeginForm
调用以反映新的操作方法名称。)
这是处理表单帖子的常见做法,您可能希望在发生错误时重新显示表单。只要方法签名不同,GET 和 POST 操作方法都可以具有相同的名称。(它们应该是,因为 GET 操作没有理由接受 a SignUpViewModel
。)
这样 POST 操作可以返回视图供用户重试。表单 POST 操作的一般流程是在发生错误时将视图返回给用户,或者在成功时重定向用户。
您可能会发现,当视图名称与控制器操作名称不匹配时,您也可以显式指定视图名称:
return View("SignUp");
虽然这在技术上是允许的,但我强烈反对这样做,除非你真的知道你在 HTTP 操作、路由和 RESTful 等方面正在做什么。因为浏览器中的 URL 仍然是AddNewUser
,而不是 SignUp
. 这可能会导致其他问题和奇怪的错误。
推荐阅读
- linux - Cordova wmic 命令失败
- c++ - 关于 SIGTSTP 错误和无休止的输入
- python-3.x - Chessboard-图像处理帧差
- python - Pandas - 按 3 列将分组导出到 JSON
- c# - 如何将 IQueryable 转换为自定义类列表?
- rust - Rust 语言是否支持非阻塞 IO?
- bash - 如何合并多个级别的所有目录?
- parallel-processing - 计算并行化的最大加速
- javascript - Visual Studio Code 似乎配置不当。Emmet (tab+enter) 问题,现在我的 Life-Server (全新安装) 将无法正常工作.. 什么?
- azure-devops - 经典编辑器中的策略/矩阵