首页新闻找找看学习计划

关于Asp.Net MVC中关与Html.ActionLink和Url.Action生成路由地址的问题

0
悬赏园豆:30 [已解决问题] 解决于 2014-10-14 22:19

项目中有区域UserManager,其下有网页对应的Action Create,该区域的路由注册是这样:

context.MapRoute(
                "UserManager_default",
                "UserManager/{controller}/{action}/{id}",
                new { action = "Index", controller = "Users", id = UrlParameter.Optional }
            );

Global中的注册代码是:

AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

(1):问题是在Create中使用ActionLink和Url.Action生成默认区域中的某Action(例如Account控制器的Logout),为什么生成的地址是/UserManager/Account/Logout。

(2):如果区域的路由注册是这样:context.MapRoute(
                "UserManager_default",
                "{area}/{controller}/{action}/{id}",
                new { action = "Index", controller = "Users", area="UserManager" id = UrlParameter.Optional }
            );

这么写正确吗,进入项目后地址是http://localhost:XXXX,页面会跑到UserManager/Users/Index,这个是因为Area中的默认路由设置导致的吗?

(3):怎么设置区域(有名称的区域和默认区域)中的路由注册才能在各个区域(有名称的/默认的)中自由定位到其他Action(可能是不同区域)就是获取URL,

北在北方的主页 北在北方 | 菜鸟二级 | 园豆:206
提问于:2014-10-09 16:43
< >
分享
最佳答案
0

1:因为  "UserManager/{controller}/{action}/{id}",前面加了UserManager。

2:对。因为你没有给地址,所以就执行默认地址。

3:@Url.Action("Index", "Home", new { area = "UserManager" })

收获园豆:30
再见2019 | 专家六级 |园豆:11616 | 2014-10-09 16:55

对于第一问,在UserManager区域中怎么根据ActionName和ControllerName定位到默认区域Action?

如果用Url.Action("ActionName","ControllerName"),生成的URL会自动加上区域注册时加载{Controller}前的前缀

北在北方 | 园豆:206 (菜鸟二级) | 2014-10-09 17:26

@北在北方: 不明白你的这个意思。

如果你要动态的:  new { action = "Index", controller = "Users", area="UserManager" id = UrlParameter.Optional }

@Url.Action("Index", "Home", new { area = "UserManager" })

如果你要写固定的:

context.MapRoute(
                "UserManager_default",
                "UserManager/{controller}/{action}/{id}",
                new { action = "Index", controller = "Users", id = UrlParameter.Optional }
            );

Url.Action("ActionName","ControllerName")

再见2019 | 园豆:11616 (专家六级) | 2014-10-09 17:51

@ArnoldZhang: 

。。。

如果你要写固定的:

context.MapRoute(
                "UserManager_default",
                "UserManager/{controller}/{action}/{id}",
                new { action = "Index", controller = "Users", id = UrlParameter.Optional }
            );

。。

如果区域路由注册是上述方式,那我如果想在该区域内的某个位置想通过Url.Action获取此区域外的Action的路径的话,应该怎么写?

北在北方 | 园豆:206 (菜鸟二级) | 2014-10-09 17:58

@北在北方: 你获取路径,也不是用Url.Action。路由只是用来匹配路径的。如果固定的满足不了。可以再加一个

context.MapRoute(
                "UserManager_default11",
                "{area}/{controller}/{action}/{id}",
                new { action = "Index", controller = "Users", area="UserManager" id = UrlParameter.Optional }
            );

再见2019 | 园豆:11616 (专家六级) | 2014-10-09 18:02

@ArnoldZhang: 如果这么注册区域路由的话,如果有多个区域,每个区域都有一个默认路由,进入系统后,会找到匹配的第一个区域的默认路由,但默认区域也有一个没有路由键area的默认路由,那是不是说,在输入网站根目录的情况下,如果想让系统进入默认区域的默认路由对应页面而不是其他区域中的,应该讲global中注册区域路由与注册默认区域路由的顺序改变就可以了,是吧

北在北方 | 园豆:206 (菜鸟二级) | 2014-10-09 18:05

@北在北方: 名字也得只能有一个:default这个名字。

再见2019 | 园豆:11616 (专家六级) | 2014-10-09 18:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册