【问题标题】:MVC Routing - URL changes when submit button is clickedMVC 路由 - 单击提交按钮时 URL 更改
【发布时间】:2016-08-03 15:40:40
【问题描述】:

我是 MVC 新手,我正在使用 ASP.Net MVC5 构建一个网站。我对路由概念有点困惑。以下是我拥有的 route.config 文件。所以每当我进入我的主页或登录页面并输入我的凭据并单击提交按钮时,我确实看到该页面允许我转到可以找到我的信息的下一页,但 URI 更改为提交按钮触发的发布操作。例如,如果我的主页登录页面 URI 是这样的

http://localhost/Home/

当点击提交时,网址变为

http://localhost/home/submit 但我加载的视图称为 AccountInfo 不知道这是如何工作的。

我还将用户信息存储在会话中,并且有一个注销按钮,因此当我单击该按钮时,我将会话设置为 null 并重定向到登录操作,但随后我的 url 更改为类似这样的内容我的 route.config 中没有任何 url 有参数作为 url 的一部分。

http://localhost/Home/Login?SourceSeqNo=0&SessionSeqNo=0&AsOfDate=4%2F12%2F2016&NumberOfContracts=0&NumberOfPassDueContracts=0

   public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
         name: "Test",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Home", action = "TESTVIEW", id = 
       UrlParameter.Optional }
       );

        routes.MapRoute(
        name: "Invoice",
        url: "{Home}/{Invoice}/{q}",
        defaults: new { controller = "Home", action = "GetInvoice", q = 
       UrlParameter.Optional }
       );

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

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

        routes.MapRoute(
          name: "Accounts",
          url: "{controller}/{action}",
          defaults: new { controller = "Home", action = "AccountStatus" }
       );

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

        routes.MapRoute(
            name: "Home",
            url: "Home",
            defaults: new { controller = "Home", action = "Login"}
       );
        routes.MapRoute(
            name: "Home1",
            url: "",
            defaults: new { controller = "Home", action = "Login" }
       );

    }

动作方法

    /// <summary>
    /// Logoffs this instance.
    /// </summary>
    /// <returns></returns>
    public ActionResult Logoff()
    {
        Session["AccountInfo"] = null;
        //return View("Login");
        return RedirectToAction("Login", new CustomerModel());   // 
     View("Login", new CustomerModel());
    }

我的提交操作如下

   [ValidateAntiForgeryToken]
    public ActionResult Submit(CustomerModel customerModel)
    {
        homeAccountViewModel = new HomeAccountStatusViewModel ();
        homeAccountViewModel.Customer = customerModel;           

        if (ModelState.IsValidField("Username") && 
         (ModelState.IsValidField("Password")))
        {
            logic here....

            return View("AccountStatus", homeAccountViewModel);
        }
        else
        {
            return View("Login", customerModel);
        }            
    }

任何帮助将是一个很大的帮助。谢谢

【问题讨论】:

  • 您的submit 操作方法如何?
  • 怎么样:Session.Clear(); Session.Abandon();
  • 我已编辑以显示提交操作方法。

标签: asp.net asp.net-mvc routing asp.net-mvc-routing


【解决方案1】:

当您的 Action 方法运行时,您正在调用:

return RedirectToAction("Login", new CustomerModel());

这将使用 outgoing 路由来构建 URL。传出路由使用控制器、操作和任何路由值来查找匹配的路由。

在这种情况下,假设您的控制器是Home(因为您没有指定)并且您将操作指定为Register,则将匹配此路由:

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

上面的路由告诉路由引擎用{controller}/{action}/{id}构建一个URL。在这种情况下,ID 是可选的,因此它不会出现在结果 URL 中。

注意:如果我没有指出您的路由配置完全错误,那我就大意了。路由框架无法区分传入路由的{controller}/{action}/{id}{Home}/{Invoice}/{q}。当您有可选值时,情况会变得更糟。您的前 2 个路由都将匹配具有 0、1、2 或 3 个段的 any URL。由于第一场比赛总是获胜,你的第二场比赛(以及大多数其他路线)永远不会到达。

更多信息请参见Why map special routes first before common routes in asp.net mvc?

【讨论】:

  • 感谢您的回答,我玩弄了我的路线,我明白你在说什么。由于我的路线都没有任何参数,并且所有路线都将采用相同的模式,我想我不需要指定这么多路线,但是,有一点让我感到困扰,对于特定路线,我们是说这是控制器,这是动作,那么它将如何调用任何其他动作?我希望你明白我想说什么
  • 这就是默认值的用途。如果您从 URL 中取出一个或多个变量并使用文字段,则 URL 无法更改它们的默认值。再看看我的linked answer。我已经用如何解决此类配置问题的选项列表对其进行了更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多