【问题标题】:MVC 5 how to specify constraints using attribute routingMVC 5 如何使用属性路由指定约束
【发布时间】:2015-05-07 19:35:19
【问题描述】:

我正在尝试做全属性路由,不使用常规路由,并尝试根据当前域告诉我的路由它们属于哪个区域。

在约定路由中,我可以指定我的object constraints,以此为例:

context.MapRoute(
    "MyRouteName",
    "admin/sign-in",
    new { controller="AdminController", action="SignIn" },
    new { SitePermitted = new SiteConstraint("Admin") } // <-- how do I do this exact line of code but in attribute routing
);

SiteConstraint 继承自 IRouteConstraint。我如何做同样的事情,但使用属性路由?我正在寻找这样的东西:

[AreaName("Admin")]
[Route("admin/sign-in")]
[new SiteConstraint("Admin")]
public ActionResult SignIn(...) {...}

其中MyConstraint 有一个Match 方法获取当前的http 请求,如果它的域是“myadmindomain.com”,那么Match 方法返回true,并且MVC 会在用户在myadmindomain 上执行此路由.com/admin/sign-in.

【问题讨论】:

    标签: attributerouting asp.net-mvc-5.2


    【解决方案1】:

    您想要做的事情需要使用类RouteFactoryAttribute,在从该类继承的 MVC 5 中,您可以使用 SiteConstraint 但使用属性路由。所以你可以有类似的东西:

    public class SiteRouteAttribute : RouteFactoryAttribute
    {
         public SiteRouteAttribute (string template, string sitePermitted) : base(template) 
         {
             SitePermitted = sitePermitted;
         }
    
         public override RouteValueDictionary Constraints
         {
              get
                {
                   var constraints = new RouteValueDictionary();
                   constraints.Add("site", new SiteConstraint(SitePermitted));
                   return constraints;
                }
          }
    
          public string SitePermitted
          {
              get;
              private set;
          }
    }
    

    然后在你的控制器中你可以拥有:

    [SiteRoute("somepath/{somevariable}/{action=Index}", "Admin")]
    public class MyController : Controller
    {
        public ActionResult Index()
        {
            ....
        }
    }
    

    看看Jon Galloway's post which has a workable example

    【讨论】:

    • 通过这种方法,您知道是否有可能有一个区域称为 Apples,另一个称为 Oranges,并且在每个区域中都有一个动作,应该根据宿主进行捕获?例如,如果主机是 www.apples.com,则应该触发的动作是 Apples 控制器中的动作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2016-11-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多