MVC路由 - 点击提交按钮后更改网址

时间:2016-04-12 20:15:41

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

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

http://localhost/Home/

点击提交时,网址变为

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

此外,我将用户信息存储在会话中,并且有一个注销按钮,所以当我单击按钮时我将会话设置为null并重定向到登录操作,但是我的网址更改为这样的内容,我没有任何url,它在我的route.config中有一个参数作为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);
        }            
    }

任何帮助都会很有帮助。感谢

1 个答案:

答案 0 :(得分:0)

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

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

这将使用传出路由来构建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}之间的区别。如果您有可选值,情况会变得更糟。您的前两条路线都会将任意网址与0,1,2或3段匹配。由于第一场比赛总是获胜,所以你的第二场比赛(以及大部分其他路线)永远不会到达。

     

有关详细信息,请参阅Why map special routes first before common routes in asp.net mvc?