using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
RouteValueDictionary PageLinkValueDictionary = new RouteValueDictionary();
PageLinkValueDictionary.Add("Number", 3);
String Path = RouteTable.Routes.GetVirtualPath(Request.RequestContext, PageLinkValueDictionary).VirtualPath;
ViewBag.Path = Path;
return View();
}
}
}
这个获取当前的路由
然后创建了个Area
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication.Areas.A.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
RouteValueDictionary PageLinkValueDictionary = new RouteValueDictionary();
PageLinkValueDictionary.Add("Number", 3);
String Path = RouteTable.Routes.GetVirtualPath(Request.RequestContext, PageLinkValueDictionary).VirtualPath;
ViewBag.Path = Path;
return View();
}
}
}
返回的路径怎么是一样的呢?
RouteConfig是这样的
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "MvcApplication.Controllers" }
);
}
区域配置是这样的:
namespace MvcApplication.Areas.A
{
public class AAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "A";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"A_Default",
"A/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "MvcApplication.Areas.A.Controllers" }
);
}
}
}
不在区域的路由应该是/才对吧,为什么也是/A
2 个解决方案
#1
RouteTable.Routes.GetVirtualPath()是到routes中遍历,遇到第一个符合的,能行得通的,就返回结果。而routes中的排序是按照路由表的扫描顺序排的,先看的是域的路由表,因此第一个路由是A的路由,中断后看一下RouteTable.Routes的第一个值就知道了,这个路由配合默认值可以正确匹配,所以是/A?Number=3。为什么第一个参数不起作用,我也没搞清楚。
这个问题可以这样解决,在域A的路由注册中插入第四个参数,constaints约束参数,约束一下路由,写成这样:
context.MapRoute(
"A_default",
"A/{controller}/{action}/{id}",
new { area="A", controller="Home", action = "Index", id = UrlParameter.Optional },
new { area="A" },
new string[] { "MvcApplication1.Areas.A.Controllers" }
);
约束一下域名必须是A,注意,此时在第三个参数默认值中,也要加上area="A",否则无法正确路由
这个问题可以这样解决,在域A的路由注册中插入第四个参数,constaints约束参数,约束一下路由,写成这样:
context.MapRoute(
"A_default",
"A/{controller}/{action}/{id}",
new { area="A", controller="Home", action = "Index", id = UrlParameter.Optional },
new { area="A" },
new string[] { "MvcApplication1.Areas.A.Controllers" }
);
约束一下域名必须是A,注意,此时在第三个参数默认值中,也要加上area="A",否则无法正确路由
#2
dingrain 非常感谢,遍历的时候,我存的路由第一个就是/A
太感谢了
太感谢了
#1
RouteTable.Routes.GetVirtualPath()是到routes中遍历,遇到第一个符合的,能行得通的,就返回结果。而routes中的排序是按照路由表的扫描顺序排的,先看的是域的路由表,因此第一个路由是A的路由,中断后看一下RouteTable.Routes的第一个值就知道了,这个路由配合默认值可以正确匹配,所以是/A?Number=3。为什么第一个参数不起作用,我也没搞清楚。
这个问题可以这样解决,在域A的路由注册中插入第四个参数,constaints约束参数,约束一下路由,写成这样:
context.MapRoute(
"A_default",
"A/{controller}/{action}/{id}",
new { area="A", controller="Home", action = "Index", id = UrlParameter.Optional },
new { area="A" },
new string[] { "MvcApplication1.Areas.A.Controllers" }
);
约束一下域名必须是A,注意,此时在第三个参数默认值中,也要加上area="A",否则无法正确路由
这个问题可以这样解决,在域A的路由注册中插入第四个参数,constaints约束参数,约束一下路由,写成这样:
context.MapRoute(
"A_default",
"A/{controller}/{action}/{id}",
new { area="A", controller="Home", action = "Index", id = UrlParameter.Optional },
new { area="A" },
new string[] { "MvcApplication1.Areas.A.Controllers" }
);
约束一下域名必须是A,注意,此时在第三个参数默认值中,也要加上area="A",否则无法正确路由
#2
dingrain 非常感谢,遍历的时候,我存的路由第一个就是/A
太感谢了
太感谢了