MVC5资源找不到问题求助:登录跳转Page视图失败
解决「资源无法找到」和URL出现
?Length=5的问题 咱们先拆解你遇到的两个核心问题:
1. URL里出现?Length=5的原因:ActionLink重载匹配错误
你现在的@Html.ActionLink写法用错了重载,导致框架把你写的@class和@style这些HTML属性当成了路由参数来处理。因为字符串类型的匿名对象会被反射出Length属性,所以URL里就多了?Length=5("Users"的长度刚好是5)。
修复ActionLink的正确写法(不过后面会说这个写法其实不适合登录场景):
你需要明确区分「路由参数」和「HTML属性」,把路由参数的位置传null(因为你不需要额外路由参数):
@Html.ActionLink("Login", "LoginPage", "Users", null, new { @class = "btn btn-default", @style = "color:red" })
2. 「资源无法找到」的核心原因:GET请求访问了POST-only的Action
你的LoginPage方法标记了[HttpPost],这意味着它只能接收POST请求,但ActionLink生成的是GET请求链接,所以点击后会找不到对应的Action方法,直接返回404。
而且,提交用户名和密码这种敏感信息,绝对不能用GET请求(参数会明文暴露在URL里),必须用POST表单提交才安全。
正确的做法:用表单替换ActionLink
把你的Login视图改成用表单包裹输入框,用提交按钮代替ActionLink:
@model MVCProject.Models.User @{ ViewBag.Title = "Login"; } <br/> <h2 align="Center">Login</h2> <div> <br/> <br/> <br/> <!-- 用Html.BeginForm生成POST表单,指向Users控制器的LoginPage方法 --> @using (Html.BeginForm("LoginPage", "Users", FormMethod.Post)) { <div align="center"> @Html.EditorFor(model => model.UserName, new { htmlAttributes = new { @class = "form-control", @placeHolder = "UserName" } }) @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" }) <br/> @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", @placeHolder = "Password", @type="password"} }) @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" }) <br/> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10" align="center"> <!-- 用提交按钮代替ActionLink --> <input type="submit" value="Login" class="btn btn-default" style="color:red" /> </div> </div> } </div>
3. 优化LoginPage方法:处理用户不存在的情况
现在你的方法如果找不到用户,会直接返回Page视图但传null,这样Page视图会报错。建议加个判断,返回Login视图并提示错误:
[HttpPost] public ActionResult LoginPage([Bind(Include = "UserName,Password")] User user) { // 先验证模型是否有效(比如用户名/密码是否为空) if (ModelState.IsValid) { var per = db.Users.Where(x => x.Password == user.Password && x.UserName == user.UserName) .FirstOrDefault(); if (per != null) { // 找到用户,跳转到Page视图展示详情 return View("Page", per); } else { // 没找到用户,添加错误信息,返回Login视图 ModelState.AddModelError("", "用户名或密码错误"); return View("Login", user); } } // 模型验证失败(比如输入为空),返回Login视图 return View("Login", user); }
4. 优化Page视图:处理模型为空的情况
为了避免找不到用户时Page视图报错,可以加个判断:
@model MVCProject.Models.User @{ ViewBag.Title = "Page"; } <h2>Page</h2> @if (Model != null) { <div> <h4>User</h4> <hr /> <dl class="dl-horizontal"> <dt> @Html.DisplayNameFor(model => model.FirstName) </dt> <dd> @Html.DisplayFor(model => model.FirstName) </dd> <dt> @Html.DisplayNameFor(model => model.LastName) </dt> <dd> @Html.DisplayFor(model => model.LastName) </dd> </dl> </div> } else { <p class="text-danger">未找到匹配的用户信息</p> }
按照上面的步骤修改后,你的登录流程就能正常工作了:输入用户名密码,点击提交按钮,POST请求到LoginPage方法,查询数据库后跳转到Page视图展示用户详情,或者返回登录页提示错误。
内容的提问来源于stack exchange,提问作者LOG
相关产品推荐
相关产品推荐

