c# - 表单没有击中控制器
问题描述
编辑了问题,因为我发现问题不在剃须刀内部,而是在路线中
我有一个非常简单的登录表单,但是不知何故,当用户按下登录时,页面会出现 Error404 并且由于某种原因它根本没有命中控制器断点。
@using (Html.BeginRouteForm("MyCustomRoute", new { controller = "login", action = "verify", FormMethod.Post }))
{
<fieldset class="clearfix">
<p><span style="float:none;color:black; font-size:20pt;"></span></p>
<p><span style="float:none;color:black; font-size:20pt;"></span></p>
<p><span class="fa fa-user"></span>@Html.TextBoxFor(m => m.UserName, new { @class = "form-control", placeholder = "Username", onkeydown = "convertTabtoEnter(this, event)", autofocus = "" })</p> <!-- JS because of IE support; better: placeholder="Username" -->
<p>
<span class="fa fa-lock"></span>@Html.PasswordFor(m => m.Password, new { @class = "form-control", placeholder = "Password", onkeyup = "convertTabtoEnter()" })
</p> <!-- JS because of IE support; better: placeholder="Password" -->
<div>
<span style="width:48%; text-align:left; display: inline-block;">
<a class="small-text" href="#">
@*Forgot
password?*@
</a>
</span>
<span style="width:50%; text-align:right; display: inline-block;"><input type="submit" value="Sign In"></span>
</div>
</fieldset>
<div class="clearfix"></div>
}
在我的登录控制器中,我有一个名为 Verify 的简单 ActionResult,带有 2 个参数。
[RoutePrefix("Login")]
public class LoginController : Controller
{
// GET: Login
public ActionResult Index()
{
return View();
}
[HttpPost]
[Route("Verify")] //Matches GET login/verify
public ActionResult Verify(string username, string password)
{...}
我在这里到底做错了什么?这不像是火箭科学。
Edit2:我注意到,每当我将 RouteConfig.cs 更改回默认值时,它都能正常工作。因此,问题不在表单标签内,而在路由内。因此,我一直在尝试添加自定义路由,以便使用此示例使其正常工作:Using Html.BeginForm() with custom routes
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "TrailersOverview",
url: "{TrailersOverview}/{action}/{vendid}",
defaults: new { controller = "TrailersOverview", action = "Index", vendId = UrlParameter.Optional }
);
routes.MapRoute(
"MyCustomRoute", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "login", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
name: "Default",
url: "{*anything}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
}
}
当我删除路由并简单地将所有内容恢复为默认值时,控制器确实会受到影响。不幸的是,对于应用程序的其余部分,我真的需要这些路由:(
解决方案
有几件事似乎是错误的:
- 路由配置中缺少您的控制器。
- 动作和控制器名称的顺序错误。
路由配置:
默认路由如下所示:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}/",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
形式:
如果您想使用 Tag Helpers,则必须将代码从以下位置更改:
<form action="@Url.Action("Login", "Verify")" method="post">
至:
<form asp-controller="Login" asp-action="Verify" method="post">
看看这里。
推荐阅读
- python - python写入文件.txt没有正确保存输出
- firebase - 即使页面已更改,仍保持 ionic 4 存活
- javascript - 查找对象数组中的总计数
- rest - 用于添加实体表单的 Rest API Url
- php - 在 Moodle 中添加匹配测验时,我在选项中遇到了这个问题
- python - Python字典转换
- python - 根据条件 python pandas 创建列
- jupyter-notebook - 有没有办法通过使用 Mathjax 的外部包在 jupyter notebook 中写下化学方程式?
- amazon-s3 - 将多个文件夹上传到 Amazon S3 存储桶
- java - 信息:检测到的方言:W3C [Utils] [ERROR] [Error] java.lang.NullPointerException