Html.BeginForm (ASP.NET MVC) 的问题

Posted

技术标签:

【中文标题】Html.BeginForm (ASP.NET MVC) 的问题【英文标题】:Problem with Html.BeginForm (ASP.NET MVC) 【发布时间】:2021-11-01 18:17:29 【问题描述】:

我试图在一个 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 中的表单上按发送时得到的:错误

【问题讨论】:

请查看AddNewUser方法return View() 【参考方案1】:

在目录树的图片中,您突出显示了一个名为SignUp 的视图。但是,如果您阅读错误消息的图片,您会发现它正在寻找一个名为AddNewUser 的视图。与您的控制器操作的名称匹配:

public ActionResult AddNewUser(SignUpViewModel model)

所以大概你的控制器动作是试图返回一个视图。而且这种观点是不存在的。

您要么需要创建该视图,要么不从该控制器操作返回视图。您可以改为将重定向返回到另一个操作。例如,如果您希望用户在表单发布后被重定向到SignUp,那么您将重定向他们:

return RedirectToAction("SignUp");

或者,如果您重命名控制器操作,您可以返回该视图:

[HttpPost]
public ActionResult SignUp(SignUpViewModel model)

(当然还要更新 BeginForm 调用以反映新的操作方法名称。)

这是处理表单帖子的常见做法,您可能希望在发生错误时重新显示表单。只要方法签名不同,GET 和 POST 操作方法都可以具有相同的名称。 (应该是这样,因为 GET 操作没有理由接受 SignUpViewModel。)

这样 POST 操作可以返回视图供用户重试。表单 POST 操作的一般流程是在发生错误时将视图返回给用户,或者在成功时重定向用户。


可能会发现,当视图名称与控制器操作名称不匹配时,您也可以显式指定视图名称:

return View("SignUp");

虽然这在技术上是允许的,但我强烈反对这样做,除非你真的知道你在 HTTP 操作、路由和 RESTful 等方面正在做什么。因为浏览器中的 URL 仍然是 AddNewUser不是 SignUp。这可能会导致其他问题和奇怪的错误。

【讨论】:

我尝试了您提出的第二个选项,它有所帮助!谢谢!【参考方案2】:

您需要在您的操作ActionResult AddNewUser 中设置返回视图 url 试试这个:

return View("~/Views/Account/SignUp.cshtml");

【讨论】:

请注意,浏览器中的结果 URL 仍将是 AddNewUser不是 SignUp。这可能会导致其他下游问题。重定向用户或重命名控制器操作以匹配预期视图是首选方法。【参考方案3】:

只需返回您想要的视图。在这种情况下,试试这个:

证明 Signup 在同一控制器上

return View("SignUp");

否则

return View("~/Views/Account/SignUp.cshtml");

【讨论】:

以上是关于Html.BeginForm (ASP.NET MVC) 的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于ASP.NET MVC的Html.BeginForm()方法

Asp.net Mvc Ajax.BeginForm提交表单

ASP.Net MVC 5 Html.BeginForm onsubmit 和具有所需属性的模型

ASP.NET MVC 文件上传

ASP.Net MVC 4 在表单提交时设置“onsubmit”

如何在 HTML 中为 ASP.NET MVC 创建一个按钮? [复制]