开发者

RouteLink issues to same action

开发者 https://www.devze.com 2022-12-19 08:51 出处:网络
I have a view that both edits and creates \"usergroups\". And I have a \"usergroup-detailsview\" (Admin/Usergroup/43) where I have 2 links:

I have a view that both edits and creates "usergroups". And I have a "usergroup-detailsview" (Admin/Usergroup/43) where I have 2 links:

Html.RouteLink("Edit", "UsergroupEdit", 
    new { usergroupID = Model.Usergroup.UsergroupID })

Html.RouteLink("Create", "UsergroupCreate")

In my global.asax I got:

routes.MapRoute("UsergroupEdit", "Admin/Usergroup/Edit/{usergroupID}",
    new { controller = "UsergroupsAdmin", action = "Edit" } );

routes.MapRoute("UsergroupCreate", "Admin/Usergroup/Edit", 
    new { controller = "UsergroupsAdmin", action = "Edit" } );

The first one where the int is passed in renders:

Admin/Usergroup/Edit/87

But the second one rend开发者_如何学Cers like:

Admin?Length=24

How can I fix this route?

/M


To remain sane ;) and to keep things clear use two routes:

routes.MapRoute(
    "UsergroupEdit",
    "Admin/Usergroup/Edit/{usergroupID}",
    new
    {
        controller = "UsergroupsAdmin", 
        action = "Edit"
    });

routes.MapRoute(
    "UsergroupCreate",
    "Admin/Usergroup/Create",
    new
    {
        controller = "UsergroupsAdmin",
        action = "Create"
    });

Also from code I see you have a controller name UsergroupsAdmin..If you have somewhere there also a Usergroups controller, you better get rid of UsergroupsAdmin and just decorate "admin" actions in Usergroups controller with [Authorize action filter.

For Authorize you can implement your own Role provider so you can check your requirements there. It will keep things very clean and maintainable.

If you decide to keep Edit route, just make sure to have only one like this:

routes.MapRoute(
    "UsergroupEdit",
    "Admin/Usergroup/Edit/{usergroupID}",
    new
    {  
        controller = "UsergroupsAdmin",  
        action = Edit",
        usergroupID = 0
    });

and check in controller action where usergroupID=0, render create view.


What you have should work just fine. Perhaps you have a typo somewhere?

I just tried this out by putting those two calls into my Index.aspx view within the HomeController and I got the following output:

<a href="/Admin/Usergroup/Edit/123">Edit</a> 
<a href="/Admin/Usergroup/Edit">Create</a>

Here was my RegisterRoutes method.

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


    routes.MapRoute("UsergroupEdit", "Admin/Usergroup/Edit/{usergroupID}",
        new { controller = "UsergroupsAdmin", action = "Edit" });

    routes.MapRoute("UsergroupCreate", "Admin/Usergroup/Edit",
        new { controller = "UsergroupsAdmin", action = "Edit" });

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

}

Most likely, you're running into a problem with another route defined before those routes.


What does your controller method "Edit" look like (the method signature)?

Are you using the int? datatype (a nullable int)?

I usually get the whole ?Length=24 thing when I am trying to map to a action and have messed up the parameters somehow.

You should also consider trying @Haacked's recommendation of reordering the routes in your globals code. I don't know who is down voting the guy, but he knows a lot about ASP.NET MVC.


Changed order, although didnt fix it completely, just made it work

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号