You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表单提交才安全。

把你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:58:00