我刚开始研究一个有几个区域的应用程序(基本网格主/详细类型系统..)我正在研究利用MVC中的漂亮路由功能(特别是4)而我“只是没有得到它“我猜想。
目前唯一定义的路线是基本路线:
routes.MapRoute("Default",
"{controller}/{action}/{id}",
new { controller = "Account", action = "Index", id = UrlParameter.Optional }
);
这很好,它适用于我们定义的区域,所以我假设它必须知道用户在哪里,并根据用户所在的位置/区域上下文路由到相应的控制器..到目前为止不错..
现在,我正在尝试设置一个可以处理
的新路线/someController/someAction/{statusName}
特别是:
/OrderManager/List/New
AND
/OrderManager/List/Viewed
其中“新”是“新”状态,并且动作签名如下所示:
public ActionResult List(string statusName)
我假设我可以在新的路线下面添加标识“statusName”而不是Id的默认路线,但当然,H路由机制如何知道它们之间的区别:
/控制器1 /动作1/15
/控制器2/1动作/新
我确实尝试以
的形式添加“静态”路线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)中的路由缺少什么?甚至一些像我这样的傻瓜能够理解的好文章?
我的理解;定义路线,并映射它的“端点”..但是,我想我不理解机器正在制造的假设..
无论如何,请告诉我是否需要进一步解释/编辑..
提前感谢。
答案 0 :(得分:10)
路由的基本原则是从上到下对它们进行评估,路由系统使用第一个匹配,而不是最佳匹配。
这意味着您必须按特定顺序订购路线,首先是最具体的路线,最后是最常规的路线。
考虑到这一原则,让我们来看看你的情况。最初,您只定义了默认路由:
routes.MapRoute("Default",
"{controller}/{action}/{id}",
new { controller = "Account", action = "Index", 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" });
请注意,由于此路由比默认路由更具体,因此您必须将此路由放在默认路由之前。
如果您想拥有更通用的路线,则需要确定此路线与默认路线的区别,因为它们都将匹配具有三个分段的路线。假设您决定新路由将接受仅包含第三段中的字母的任何内容,保留默认路由以处理包含数字的任何内容。您可以使用路径约束来完成此操作。例如,您可以按如下方式编写路线:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", 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]+$" });
使用这两条路线,在第三段中只有字母的任何三段网址会将第三段放入名为“statusName”的变量,而第三段中带有整数的任何网址都会将第三段放入变量名为“id”。
在任何真正复杂的应用中,路由可能会变得复杂,为路由编写单元测试非常有利,以确保在添加或修改路由时不会搞砸。
有关路由的详细参考,请参阅Scott Sanderson's book或查看MSDN documentation