ASP.NET MVC中用HTML Button提交数据报资源找不到错误的解决方法
看起来你遇到的核心问题是表单提交时路由匹配失败,再加上视图里存在两个提交按钮却没有区分逻辑,导致请求无法正确映射到你的Registration_ Post Action。咱们一步步来梳理解决:
问题根源分析
Html.BeginForm()的默认匹配问题:你现在用的无参BeginForm()会默认沿用当前请求的路由信息,但如果视图命名、控制器路由配置有偏差,就容易出现提交时找不到对应Action的情况。- 多提交按钮的逻辑冲突:表单里同时有Login和SignUp两个按钮,默认点击任意一个都会触发相同的Post请求,但你的Controller里只有处理注册的
Registration_Post Action,这不仅会导致业务逻辑混乱,也可能间接引发路由匹配异常。 - Action命名的小隐患:虽然下划线本身不违反规则,但特殊字符在路由解析时偶尔会出现意外,不过这不是本次问题的主要诱因。
具体解决方案
1. 明确指定表单的提交目标
修改Html.BeginForm(),手动指定要提交到的Action和Controller,彻底避免路由自动匹配出错:
@using (Html.BeginForm("Registration_", "你的控制器名称", FormMethod.Post)) { // 原有表单内容保持不变 }
记得把你的控制器名称替换成实际的控制器类名(比如你的控制器是AccountController,就写Account)。
2. 区分两个提交按钮的业务逻辑
因为你在同一个表单里放了登录和注册两个功能,需要给按钮添加name和value属性,让Controller能识别是哪个按钮触发的提交:
视图中修改按钮代码:
<!-- Login按钮 --> <button type="submit" name="submitAction" value="Login">Login</button> <!-- 注册按钮 --> <button type="submit" name="submitAction" value="Register">SignUp/Register</button>
Controller中添加分支处理逻辑:
在Post Action里根据按钮的提交值,分别处理登录和注册逻辑:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Registration_(Registration reg, string submitAction) { if (submitAction == "Register") { // 处理注册逻辑 if (ModelState.IsValid) { DB.Registrations.Add(reg); DB.SaveChanges(); return RedirectToAction("Index", "Home"); } } else if (submitAction == "Login") { // 这里添加你的登录验证逻辑,比如检查用户账号密码等 return RedirectToAction("Dashboard", "Home"); } // 如果验证失败,返回原视图并保留用户输入 return View(reg); }
3. 额外优化建议
- 建议把登录和注册拆分成两个独立的表单/页面,这样业务逻辑更清晰,也能从根源上避免提交冲突问题。
- 检查你的路由配置文件(
RouteConfig.cs),确保默认路由规则能正确匹配你的Action:
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
这个默认路由可以正确匹配/你的控制器名称/Registration_这类请求。
验证步骤
- 修改代码后重新编译项目。
- 打开页面右键查看源代码,确认表单的
action属性正确指向了/你的控制器名称/Registration_。 - 点击注册按钮,检查是否能成功跳转到Home/Index页面,同时查看数据库是否新增了注册数据。
内容的提问来源于stack exchange,提问作者Zeeshan Haider
相关产品推荐
相关产品推荐

