UPDATE : Ceci a été posté sur codeplex . Le code source complet ainsi que l'assemblage pré-compilé sont disponibles en téléchargement. Je n'ai pas encore eu le temps de poster la documentation sur le site, donc ce message de l'OS devra suffire pour le moment.
UPDATE : J'ai ajouté quelques nouveaux attributs pour gérer 1) l'ordre des routes, 2) les contraintes des paramètres de route, et 3) les valeurs par défaut des paramètres de route. Le texte ci-dessous reflète cette mise à jour.
J'ai en fait fait quelque chose comme ça pour mes projets MVC (je n'ai aucune idée de la façon dont Jeff le fait avec stackoverflow). J'ai défini un ensemble d'attributs personnalisés : UrlRoute, UrlRouteParameterConstraint, UrlRouteParameterDefault. Ils peuvent être attachés aux méthodes d'action des contrôleurs MVC pour que les routes, les contraintes et les valeurs par défaut leur soient automatiquement liées.
Exemple d'utilisation :
(Notez que cet exemple est quelque peu artificiel mais qu'il démontre la fonctionnalité).
public class UsersController : Controller
{
// Simple path.
// Note you can have multiple UrlRoute attributes affixed to same method.
[UrlRoute(Path = "users")]
public ActionResult Index()
{
return View();
}
// Path with parameter plus constraint on parameter.
// You can have multiple constraints.
[UrlRoute(Path = "users/{userId}")]
[UrlRouteParameterConstraint(Name = "userId", Regex = @"\d+")]
public ActionResult UserProfile(int userId)
{
// ...code omitted
return View();
}
// Path with Order specified, to ensure it is added before the previous
// route. Without this, the "users/admin" URL may match the previous
// route before this route is even evaluated.
[UrlRoute(Path = "users/admin", Order = -10)]
public ActionResult AdminProfile()
{
// ...code omitted
return View();
}
// Path with multiple parameters and default value for the last
// parameter if its not specified.
[UrlRoute(Path = "users/{userId}/posts/{dateRange}")]
[UrlRouteParameterConstraint(Name = "userId", Regex = @"\d+")]
[UrlRouteParameterDefault(Name = "dateRange", Value = "all")]
public ActionResult UserPostsByTag(int userId, string dateRange)
{
// ...code omitted
return View();
}
Définition de UrlRouteAttribute :
/// <summary>
/// Assigns a URL route to an MVC Controller class method.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteAttribute : Attribute
{
/// <summary>
/// Optional name of the route. If not specified, the route name will
/// be set to [controller name].[action name].
/// </summary>
public string Name { get; set; }
/// <summary>
/// Path of the URL route. This is relative to the root of the web site.
/// Do not append a "/" prefix. Specify empty string for the root page.
/// </summary>
public string Path { get; set; }
/// <summary>
/// Optional order in which to add the route (default is 0). Routes
/// with lower order values will be added before those with higher.
/// Routes that have the same order value will be added in undefined
/// order with respect to each other.
/// </summary>
public int Order { get; set; }
}
Définition de UrlRouteParameterConstraintAttribute :
/// <summary>
/// Assigns a constraint to a route parameter in a UrlRouteAttribute.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteParameterConstraintAttribute : Attribute
{
/// <summary>
/// Name of the route parameter on which to apply the constraint.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Regular expression constraint to test on the route parameter value
/// in the URL.
/// </summary>
public string Regex { get; set; }
}
Définition de UrlRouteParameterDefaultAttribute :
/// <summary>
/// Assigns a default value to a route parameter in a UrlRouteAttribute
/// if not specified in the URL.
/// </summary>
[AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UrlRouteParameterDefaultAttribute : Attribute
{
/// <summary>
/// Name of the route parameter for which to supply the default value.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Default value to set on the route parameter if not specified in the URL.
/// </summary>
public object Value { get; set; }
}
Modifications apportées à Global.asax.cs :
Remplacez les appels à MapRoute, par un appel unique à la fonction RouteUtility.RegisterUrlRoutesFromAttributes :
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteUtility.RegisterUrlRoutesFromAttributes(routes);
}
Définition de RouteUtility.RegisterUrlRoutesFromAttributes :
La source complète est sur codeplex . Veuillez vous rendre sur le site si vous avez des commentaires ou des rapports de bogue.