asp.net mvc基于路由参数值的动态区域选择

时间:2011-11-16 13:46:47

标签: asp.net-mvc-3 routes

我正在开展围绕体育赛事的申请。有不同类型的活动,如足球锦标赛和网球锦标赛。根据锦标赛的类型,我想让不同区域的请求进行处理。但是事件及其锦标赛类型可以由应用程序的用户配置并存储在数据库中。

目前我有这个概念证明:

public class SoccerTournamentAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "SoccerTournament";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        var soccerTournaments = new string[] { "championsleague", "worldcup" };
        foreach (var tournament in soccerTournaments)
        {
            context.MapRoute(
                string.Format("SoccerTournament_default{0}", tournament),
                string.Format("{0}/{{controller}}/{{action}}/{{id}}", tournament),
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Mvc3AreaTest1.Areas.SoccerTournament.Controllers" }
                );
        }
    }
}

并且它只有我想要来自数据库的足球锦标赛(不是问题)但是我也想让它工作,因为新的事件/锦标赛类型记录被添加到数据库并且在这不起作用案件。

如何使区域选择动态而不是硬编码到路线中?

1 个答案:

答案 0 :(得分:1)

区域注册仅在应用程序启动时发生,因此在重新启动之前不会捕获启动后添加的任何锦标赛。

要为锦标赛制定动态路由方案,您必须重新定义区域路线并添加RouteConstraint

按如下方式重新定义您的路线:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "SoccerTournament_default",
        "{tournament}/{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new { tournament = new MustBeTournamentName() },
        new string[] { "Mvc3AreaTest1.Areas.SoccerTournament.Controllers" }
    );
}

然后,您可以在此问题的答案中创建MustBeTournamentName RouteConstraint以类似于RouteConstraint:Asp.Net Custom Routing and custom routing and add category before controller