【问题标题】:Custom route gives error 404 in ASP.NET MVC application C#自定义路由在 ASP.NET MVC 应用程序 C# 中给出错误 404
【发布时间】:2021-12-26 05:00:48
【问题描述】:

我已经创建了一个登录操作方法来登录用户,虽然我已经搭建了模型和视图,但我现在正尝试将该路由添加到特定页面,但我收到错误 404,因为它找不到路线。

下面是 UsersController.cs :

 // GET: Users
    public ActionResult Index()
    {
        return View(db.Users.ToList());
    }

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(User objUser)
{
        if (ModelState.IsValid)
        {
            using (DE_StoreContext db = new DE_StoreContext())
            {
                var obj = db.Users.Where(a => a.username.Equals(objUser.username) && a.Password.Equals(objUser.Password)).FirstOrDefault();

                if (obj != null)
                {
                    Session["UserID"] = obj.id.ToString();
                    Session["UserName"] = obj.username.ToString();
                    return RedirectToAction("UserDashBoard");
                }
            }
        }

        return View(objUser);
}

这是网页Login.cshtml:

@model DE_Store.Models.User
@{
    ViewBag.Title = "Login";
}

@using (Html.BeginForm("Login", "Users", FormMethod.Post))
{
    <fieldset>
        <legend>Mvc Simple Login Application Demo</legend>

        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        @if (@ViewBag.Message != null)
        {
            <div style="border: 1px solid red">
                @ViewBag.Message
            </div>
        }
        <table>
            <tr>
                <td>@Html.LabelFor(a => a.username)</td>
                <td>@Html.TextBoxFor(a => a.username)</td>
                <td>@Html.ValidationMessageFor(a => a.username)</td>
            </tr>
            <tr>
                <td>
                    @Html.LabelFor(a => a.Password)
                </td>
                <td>
                    @Html.PasswordFor(a => a.Password)
                </td>
                <td>
                    @Html.ValidationMessageFor(a => a.Password)
                </td>
            </tr>
            <tr>
                <td></td>
                <td>
                    <input type="submit" value="Login" />
                </td>
                <td></td>
            </tr>
        </table>
    </fieldset>
}  

这是我用于路由的route.config.cs 文件:

routes.MapRoute(
                name: "Login",
                url: "{controller}/{action}/{id}",
                 new { controller = "Users", action = "Login", id = UrlParameter.Optional }
                );

我个人的想法要么是我在Login页面中定义错误,要么是自定义路由错误,我一直在尝试使用教程添加Login动作方法。我尝试通过添加链接从 Web 应用程序的另一部分访问,但找不到 /Users/Login 路由

【问题讨论】:

  • 与您的问题不严格相关,但以明文形式存储密码绝不是一个好主意!
  • 谢谢,我知道了,目前只是为了演示目的
  • @LasSincas:您使用表单身份验证吗?请出示您的[HttpGet] Login() 代码。
  • 不,我不是` public ActionResult Index() { return View(db.Users.ToList()); }`
  • 如果你也有默认映射,那么映射这条路线有什么意义(你)?

标签: c# asp.net-mvc routes


【解决方案1】:

@拉斯辛卡斯。这就是你的控制器代码的样子。请注意,您需要像 Jackdaw 所指出的那样登录操作。这就是您的路线所指向的操作。

using DE_Store.Models;
using System.Linq;
using System.Web.Mvc;

namespace DE_Store.Controllers
{
    public class UsersController : Controller
    {
        // GET: Users
        public ActionResult Index()
        {
            return View(db.Users.ToList());
        }

        [HttpGet]
        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(User objUser)
        {
            if (ModelState.IsValid)
            {
                using (DE_StoreContext db = new DE_StoreContext())
                {
                    var obj = db.Users.Where(a => a.username.Equals(objUser.username) && a.Password.Equals(objUser.Password)).FirstOrDefault();

                    if (obj != null)
                    {
                        Session["UserID"] = obj.id.ToString();
                        Session["UserName"] = obj.username.ToString();
                        return RedirectToAction("UserDashBoard");
                    }
                }
            }

            return View(objUser);
        }
    }
}

否则,如果您只有一个 Index 操作,请保留 Wiktor 解释的默认路由,否则将您的映射更改为:

        routes.MapRoute(
            name: "Login",
            url: "{controller}/{action}/{id}",
                new { controller = "Users", action = "Index", id = UrlParameter.Optional }
            );

【讨论】:

  • 以上行不通。我已经有一个“索引”文件,它不是登录页面,因为它是我拥有用户列表的页面。然后我应该将 Index ActionResult 更改为登录 [HttpGet] 吗?我在 UserController 中有不同的操作,每个操作都有不同的视图,所以 1 个用于索引,1 个用于登录,1 个用于仪表板
【解决方案2】:

你必须指定控制器? return RedirectToAction("UserDashBoard", "Home");

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2017-06-05
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
相关资源
最近更新 更多