博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Route学习笔记之Area的Route注册
阅读量:4361 次
发布时间:2019-06-07

本文共 3088 字,大约阅读时间需要 10 分钟。

前一段时间接触了MVC的Area可以将模型、控制器和视图分成各个独立的节点。分区之后,区域路由注册的需求就出来了。

默认的

在MVC项目上右键添加区域之后,在文件夹下会自动添加一个FolderNameAreaRegistration.cs的文件。

public class AdminAreaRegistration : AreaRegistration{    public override string AreaName    {        get        {            return "Admin";        }    }    public override void RegisterArea(AreaRegistrationContext context)    {        context.MapRoute(            "Admin_default",            "Admin/{controller}/{action}/{id}",            new { action = "Index", id = UrlParameter.Optional }        );    }}

在其中,定义了一个继承AreaRegistration的类,类下面 重写了AreaName和RegisterArea。当然,这一串代码已经可以很好的解决区域的路由注册问题了。

但是对于这重复的代码有点排斥,另一个也想看看有没有其他的替换方式。

想看看能不能在路由注册那里统一管理

插曲一

之前在的时候,碰到过区域下页面的layout链接错误的问题,后来的解决方式是在ActionLink的routeValue参数里面定义area=""。

情况和这里的有点像,不同的是,上面的需要清除area,这里需要添加area。

插曲二

最近在看《asp.net mvc4高级编程》这本书,接触到一个很有用的工具RouteDebugger。

过程一

路由注册那里,调用的是routes.MapRoute函数,来向RouteTable.Routes中添加route。这个函数有好几个扩展,结合上面插曲一的思路,在扩展函数的defaults里面,尝试添加属性area="Test":

routes.MapRoute(   name: "Test_Default",   url: "Test/{controller}/{action}/{id}",   defaults: new { area = "Test", controller = "AAA", action = "Index", id = UrlParameter.Optional },   namespaces: new string[] { "MVCTest.Areas.Test.Controllers" });

调试通过RouteDebugger看:

输入/Test/AAA/Index,页面报错,此路不通。

过程二

同事研究这块时,发现除了默认AreaRegistration类以外的方法:

[RouteArea("Admin")][RoutePrefix("Test")][Route("{action=index}")]public partial class TestController : Controller{}

在区域下的Controller上面添加Route相关特性。主要就三个:Route、RouteArea和RoutePrefix。第一个定义Area,第二个定义Controller,第三个定义默认action值为index。实际调试后,发现前台准确的匹配到了路由,思路OK

到此,结合RouteDebugger,再调试到前台,我们可以看到:

从这个图可以看出,MapRoute的数据定义了Url、Defaults和Constraints,后面的DataTokens不能通过MapRoute函数里面传入。

查看源代码:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces){    if (routes == null)    {        throw new ArgumentNullException("routes");    }    if (url == null)    {        throw new ArgumentNullException("url");    }    Route route = new Route(url, new MvcRouteHandler())    {        Defaults = CreateRouteValueDictionaryUncached(defaults),        Constraints = CreateRouteValueDictionaryUncached(constraints),        DataTokens = new RouteValueDictionary()    };    ConstraintValidation.Validate(route);    if ((namespaces != null) && (namespaces.Length > 0))    {        route.DataTokens[RouteDataTokenKeys.Namespaces] = namespaces;    }    routes.Add(name, route);    return route;}

注意,上面的DataTokens是new了一个RouteValueDictionary对象。

而想要注入的area数据正是在DataTokens里面。所以上面的第一次尝试失败,是因为数据注入到了Defaults里面。

到了这里,怎么在RegisterRoutes里面统一管理区域的路由注册,思路已经呼之欲出了。

解决方案:

routes.Add(new Route("PaperMaster/{controller}/{action}/{id}"    , new RouteValueDictionary(new { controller = "Papers", action = "Index", id = UrlParameter.Optional })    , new RouteValueDictionary()    , new RouteValueDictionary(new { area = "PaperMaster", namespaces = "Packmage.Web.Areas.PaperMaster.Controllers" })    , new MvcRouteHandler()));

直接实例化Route对象,输入它的各个需要的属性;不用MapRoute,改用Add,直接向RouteTable.Routes中添加route对象。

转载于:https://www.cnblogs.com/zjoch/p/4506390.html

你可能感兴趣的文章
存储过程 <3> 和函数的区别
查看>>
高级service之ipc ADIL用法
查看>>
Django框架-基础篇
查看>>
Leetcode: Binary Tree Maximum Path Sum
查看>>
通过虚拟环境创建并开始一个django
查看>>
关于 input[type="button"] , button
查看>>
Android ViewDragHelper全然解析 自己定义ViewGroup神器
查看>>
c++ 基础 const char* 转 char*
查看>>
JS-- 小细节--你悟到了什么?
查看>>
收款 借贷
查看>>
Gson关于抽象类的序列化与反序列化
查看>>
Java面向对象之类和对象
查看>>
Oracle数据库提权(dba权限执行系统命令)
查看>>
Hydra爆破神器使用
查看>>
java.util.zip.ZipException: duplicate entry(重复依赖多版本的类库)
查看>>
Run MVC in older version of IIS
查看>>
Ajax 监听
查看>>
隐藏"站长统计"图标
查看>>
Oracle select 中case 的使用以及使用decode替换case
查看>>
创建一个dynamics 365 CRM online plugin (十二) - Asynchronous Plugins
查看>>