Correct me on URL routing in MVC issue

帅比萌擦擦* 提交于 2019-12-12 03:26:11

问题


This is related my question which i asked in this link correct me on url routing in mvc

Now i came with another problem, so i thought i will ask it as new question.

Now i have following routes in my global.asax file

routes.MapRoute(
           "Custom", // Route name
           "{action}/{id}", // URL with parameters
           new { controller = "Authentication", action = "BigClientLogin", id = UrlParameter.Optional } // Parameter defaults
       );

and

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Authentication", action = "BigClientLogin", id = UrlParameter.Optional } // Parameter defaults
        );

Now what happens is when i run my solution the URL i am getting is http://localhost:65423/Login this is what i need for my Login Page that is OK. But when i login in as user i am getting "The resource cannot be found" error.

when i checked it i can see that my URL is now changed to http://localhost:65423/Admin/Dashboard

So i think this causing the issue. So this looks the problem related to my global.asax routing.

Can anyone help me to find out what i did wrong.


回答1:


You have 2 routes with completely optional segments. The issue is that there is no way for the routing framework to differentiate between them.

The only way you can make it work with your existing routes is to specify them explicitly by name (such as when using @Html.RouteLink or @Html.RouteUrl).

@Html.RouteLink("Custom Link 1", "Custom", new { action = "BigClientLogin" })
@Html.RouteLink("Custom Link 2", "Custom", new { action = "Action2" })
@Html.RouteLink("Home Page", "Default", new { controller = "Home", action = "Index" })
@Html.RouteLink("About", "Default", new { controller = "Home", action = "About" })

Doing it that way will function, but is not normal. Typically, there is only one route configured with all defaults for the controller, action, and id and the rest have some explicitly declared segments and/or constraints (segments being preferable).

routes.MapRoute(
   "Custom", // Route name
   "Custom/{action}/{id}", // URL with parameters
   new { controller = "Authentication", action = "BigClientLogin", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Authentication", action = "BigClientLogin", id = UrlParameter.Optional } // Parameter defaults
);

The first route will now only match when the URL starts with /Custom/. If it does not start with custom, it will match the default route.

The trick is to ensure that the routes are listed in the right order and that they only match the URL in specific cases, letting them pass on to the next route in the list if the case is not correct.




回答2:


It happens because of 2 things. 1st the sequence of Your route 2nd your defaults

So if you end up on 'admin/dashboard' that's not a default, guess you've just put it in your studio to start there?

To get to http://localhost:65423/Login you'll need an action on Your AuthenticationController called 'Login' but it looks like the one You have configured is 'BicClientLogin' so You won't be taken to login unless you specify it, and at that time it has to exist.

To Help You further we need to know what controllers You have and what actions there exists, plus if security is part of your solution and if in case, what is is set to use.



来源:https://stackoverflow.com/questions/28155168/correct-me-on-url-routing-in-mvc-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!