设为首页 加入收藏

TOP

(9)ASP.NET Core 中的MVC路由二(二)
2019-09-17 17:38:23 】 浏览:41
Tags:ASP.NET Core MVC 路由
两个业务场景在MVC中配置使用默认传统路由和区域路由:

public class Startup
{  
    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc(routes =>
        {
            routes.MapAreaRoute(
                name: "MyAreaPurchase",
                areaName: "Purchase",
                template: "Purchase/{controller}/{action}/{id?}");
            routes.MapAreaRoute(
                name: "MyAreaSale",
                areaName: "Sale",
                template: "Sale/{controller}/{action}/{id?}");
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            //等价于
            //routes.MapAreaRoute("purOrder_route", "Purchase",
            //"Purchase/{controller}/{action}/{id?}");
            //routes.MapAreaRoute("saleOrder_route", "Sale",
            //"Sale/{controller}/{action}/{id?}");
            //routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

在上面的示例中,路由值将与以下操作匹配:

[Area("Purchase")]
public class PurOrderController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}
[Area("Sale")]
public class SaleOrderController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

在每个控制器加入AreaAttribute属性是表示该控制器是某个区域的一部分,比方说,PurOrderController控制器位于Purchase区域中,SaleOrderController控制器位于Sale区域中。 而没有 [Area] 属性的控制器不是任何区域的成员,在路由提供area路由值时不匹配时,打开对应控制器下的视图时将无法打开。在上面的示例中,只有所列出PurOrderController、SaleOrderController控制器下视图Index的路由值 { area = Purchase, controller = PurOrder, action = Index } 、{ area = Sale, controller = SaleOrder, action = Index }匹配才能打开对应链接。

4.实现IActionConstraint的路由约束

实现IActionConstraint约束最简单的方法是创建派生自System.Attribute的类,并将其置于操作(Action)和控制器(Controller)上。 MVC将自动发现任何应用为属性的IActionConstraint属性,便对应用程序模型应用程序进行约束。在下面的示例中,对路由数据中的国家/地区选择操作进行约束。

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)
    {
        string routeDataValue = context.RouteContext.RouteData.Values["id"] == null ? "" : context.RouteContext.RouteData.Values["id"].ToString();
        return string.Equals(
            routeDataValue,
            _countryCode,
            StringComparison.OrdinalIgnoreCase);
    }
}
public class HomeController : Controller
{
    [CountrySpecific("en-us")]
    public IActionResult Index(string id)
    {
        return View();
    }
}

根据官网解释IActionConstraint.Order是顺序约束意思,比如HomeController 控制器上有[CountrySpecific("en-us")]和[HttpGet](或者其他自定义属性约束)属性约束,数值较低的属性约束先运行。响应结果通过下面表格进行分析:

Route Url

Result

[SERVICE_NAME]/Home/Index/en-us

200

[SERVICE_NAME]/Home/Index/zh-cn

404

通过以上的表格可以知道,在此例中,当Index传入路由值(en-us)匹配时,Accept方法返回true以表示该操作是匹配项,然后可以打开连接,反之传入值(zh-cn)不匹配,则404。

 

参考文献:
在 ASP.NET Core 中路由到控制器操作

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Asp.Net Core 轻松学-使用MariaDB.. 下一篇mvc5 源码解析1:UrlRoutingModule

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目