ASP.NET Core MVC学习教程之路由(Routing)(5)

MapAreaRoute创建一个路由,同时使用默认路由和area 约束,约束使用提供的区域名 OMS。默认值保证路由总是处理 {area = OMS},约束要求值{area = OMS} 来进行URL生成。

常规路由是顺序依赖。一般区域路由放置在前面,因为区域路由更具体。

AreaAttribute表示控制器属于一个区域的一部分,即这个控制器是在 OMS 区域。控制器不带[Area] 特性则不属于任何区域。

当在区域内执行操作时,区域的路由值将作为环境值以用于URL生成,这意味着,在默认情况下,区域对URL生成具有黏性:

namespace Blog.Areas.OMS.Controllers { [Area("OMS")] public class OrderController : Controller { // GET: Order public ActionResult Index() { //生成/OManage/Home/Create var url = Url.Action("Create","Home"); //生成/Home/Create var url1 = Url.Action("Create", "Home",new { area=""}); return View(); } } }

16.IActionConstraint

通常应用程序不需要自定义 IActionConstraint,[HttpGet] 特性以及类似的特性实现 IActionConstraint 接口,以限制方法的执行。

当两个操作一模一样,其中一个操作使用 IActionConstraint,总是认为比没有使用的操作更好,因为它被视为更加具体,并且两个操作都可以在匹配是被选中。(没有使用的操作会匹配任何HTTP谓词)

概念上,IActionConstraint 是重载的一种形式,但不是使用相同名称的重载,它是匹配相同URL操作的重载。特性路由也使用 IActionConstraint ,并且可以导致不同控制器的操作都被视为候选操作。

实现 IActionConstraint 最简单的方式是创建一个类派生自 System.Attribute ,并且将它放置到操作和控制器上。MVC会自动发现任何作为特性被应用的 IActionConstraint。你可以使用程序模型来应用约束,可能是最灵活的方法,因为它允许对它们如何被应用进行元编程。

一个例子,一个约束选择一个基于来自路由数据的 country code 操作:

public class CountrySpecificAttribute:Attribute,IActionConstraint { private readonly string _countryCode; public CountrySpecificAttribute(string countryCode) { _countryCode = countryCode; } public int Order { get { return 0; } } public bool Accept(ActionConstraintContext context) { return string.Equals( context.RouteContext.RouteData.Values["country"].ToString(), _countryCode,StringComparison.OrdinalIgnoreCase); } }

Accept 方法返回true,表示当country路由值匹配时操作时匹配的。这个和 RouteValueAttribute 不同,因为它允许回退到一个非特性操作。这个例子展示了如果定义一个 en-US 操作,然后国家代码是 fr-FR,则会回退到一个更通用的控制器,这个控制器没有应用 [CountrySpecific(...)] 。

Order属性和 [HttpGet] 特性中的Order属性一样,用来决定运行顺序。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdszdz.html