加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用自定义段变量设置ASP.Net MVC 4路由

发布时间:2020-12-16 07:28:37 所属栏目:asp.Net 来源:网络整理
导读:我刚开始研究一个有几个区域的应用程序(基本的网格主/系统细节类型……)我正在研究利用MVC中的漂亮路由功能(特别是4个)而我“只是没有得到它”我相信. 目前唯一定义的路线是基本路线: routes.MapRoute("Default","{controller}/{action}/{id}",new { contro
我刚开始研究一个有几个区域的应用程序(基本的网格主/系统细节类型……)我正在研究利用MVC中的漂亮路由功能(特别是4个)而我“只是没有得到它”我相信.

目前唯一定义的路线是基本路线:

routes.MapRoute("Default","{controller}/{action}/{id}",new { controller = "Account",action = "Index",id = UrlParameter.Optional }
        );

这很好,它适用于我们定义的区域,所以我假设它必须知道用户在哪里,并根据用户所在的位置/区域上下文路由到相应的控制器..到目前为止很好..

现在,我正在尝试建立一条可以处理的新路线

/someController/someAction/{statusName}

特别是:

/OrderManager/List/New

/OrderManager/List/Viewed

其中“新”是“新”状态,并且Action Signature看起来像:

public ActionResult List(string statusName)

我假设我可以添加新的路由低于默认的路由标识“statusName”而不是Id,但当然,H将如何路由机制知道之间的区别:

/控制器1 /动作1/15

/控制器2 /动作2 /新

我确实尝试添加一个“静态”路径的形式

routes.MapRoute("Default","ControllerName/ControllerAction/{statusName}",new { statusName = UrlParameter.Optional }
        );

我以为我可以“hiJack”只是一条路线,并做一些特殊的事情,但要知道有用,路由器在第一场比赛停止?我认为无论如何这是解决这个问题的错误方法..

所以现在我想要达到这样的想法:

/somecustomroutename/somesortValue

恩.
????/ OrderManagerList / viewNew

这些路线基本上是“别名”.我原以为添加以下路线就可以了:

routes.MapRoute("Default_List","OrderManagerList/{statusName}",new {controller="OrderManager",action="List",statusName= UrlParameter.Optional }
      );

与OrderManager控制器上的相关操作:

public ActionResult List(string statusName)

无论我尝试什么,参数都为null,或者“无法找到资源”

我知道控制器需要有一个相应的View文件..但这不是问题,问题是我尝试理解路由..

所以我的问题……从根本上说,我对MVC(4)中的路由缺少什么?甚至一些像我这样的傻瓜能够理解的好文章?

我的理解;定义路线,并映射它的“端点”..但是,我想我不理解机器正在制造的假设.

无论如何,如果需要进一步解释/编辑,请告诉我..

提前致谢.

解决方法

路由的基本原则是从上到下对它们进行评估,路由系统使用第一个匹配,而不是最佳匹配.

这意味着您必须按特定顺序排列您的路线,首先是最具体的路线,最后是最常规的路线.

考虑到这一原则,让我们来看看你的情况.最初,您只定义了默认路由:

routes.MapRoute("Default",id = UrlParameter.Optional }
    );

网址格式为“{controller} / {action} / {id}”.就其本身而言,这将匹配任何三段URL,并且不会匹配少于三个段的任何URL.但是,第三个输入参数是默认参数,它定义第一个和第二个段的默认值,并指示第三个段是可选的.这样做的下一个效果是使路由匹配URL具有0,1,2或3个段.

现在,您要添加第三个URL段映射到“statusName”参数的路由,并且可以处理以下URL:

OrderManager/List/New 
OrderManager/List/Viewed

您可以在此处采用两种基本方法.您可以1)创建一个非常具体的路由,只处理这两个URL,或2)您可以尝试创建一个更通用的路由来处理一般情况.让我们先来看第一个案例.您可以按如下方式创建路线:

routes.MapRoute("","OrderManager/List/{statusName}",new { Controller = "OrderManager",Action = "List" });

请注意,由于此路由比默认路由更具体,因此必须将此路由放在默认路由之前.

如果您想要更通用的路由,则需要确定此路由与默认路由的区别,因为它们都将匹配具有三个段的URL.假设您决定新路由将接受仅包含第三段中的字母的任何内容,保留默认路由以处理包含数字的任何内容.您可以使用路径约束来完成此操作.例如,您可以按如下方式编写路线:

routes.MapRoute(
            name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home",id = UrlParameter.Optional },constraints: new { id = @"^d+$" });

        routes.MapRoute(
            name: "NewRoute",url: "{controller}/{action}/{statusName}",defaults: new { Controller = "OrderManager",Action = "List" },constraints: new { statusName = "^[A-Za-z]+$" });

使用这两个路由,任何三段URL在第三段中只有字母将把第三段放入一个名为“statusName”的变量,而在第三段中带有整数的任何URL都会将第三段放入一个名为“ ID”.

在任何真正复杂的应用中,路由可能会变得复杂,为路由编写单元测试非常有利,以确保在添加或修改路由时不会搞砸.

有关路由的详细参考,请参阅Scott Sanderson’s book或参见MSDN documentation

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读