MVC Areas的使用,有一个问题,请大家帮帮忙

时间:2021-11-15 08:57:15


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",否则无法正确路由

#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",否则无法正确路由

#2


dingrain 非常感谢,遍历的时候,我存的路由第一个就是/A
太感谢了