2009-06-16 6 views
1

Je suis en train de travailler sur une application qui a vu le jour lors du Preview 2 jours d'ASP.NET MVC. C'est assez sale par endroits, et j'essaye de le nettoyer. Un problème que j'essaie de surmonter est un code trop verbeux.Comment définir les valeurs par défaut des paramètres par action dans ASP.NET MVC?

Par exemple, j'ai une tonne de méthodes qui ressemblent exactement comme ça, mais avec différents paramètres de tri par défaut. Les paramètres par défaut de page et de page ne changent pas dans l'application.

public ActionResult List(int? page, int? pagesize, string sortby, string sortorder) 
{ 
    if (string.IsNullOrEmpty(sortby)) 
     sortby = "ClientInvoiceNumber"; 
    if (string.IsNullOrEmpty(sortorder)) 
     sortorder = "desc"; 
    page = page ?? 1; 
    pagesize = pagesize ?? 10; 

    ... 

    return View(); 
} 

maintenant idéalement, C# appuierait-il quelque chose comme ceci:

public ActionResult List(int page = 1, int pagesize = 10, string sortby = "ClientInvoiceNumber", string sortorder = "desc") 

Mais bien sûr, ce n'est pas le cas.

Où exactement dans ASP.NET MVC est-ce que je chercherais à écrire du code pour définir les paramètres par défaut sur une base par action plutôt que par route? Est-ce que quelqu'un a résolu ce problème d'une manière propre, ou y at-il quelque chose de cuit dans le cadre que je ne suis tout simplement pas au courant? Si possible, j'aimerais ajouter des paramètres par défaut aux collections de paramètres HttpRequestBase.

J'ai pensé à ce quelques-uns, mais je voudrais laisser la question ouverte pour ne pas guider artificiellement les réponses dans une direction spécifique. Je me rends compte que les valeurs par défaut peuvent être définies dans les définitions d'itinéraire, mais je voudrais définir les valeurs par défaut par action sans avoir à créer un milliard de routes.

+0

Vous devez sous-classer ControllerActionInvoker et remplacer la méthode GetParameterValue(). Il y a une demande ouverte pour ajouter le support de [DefaultValue] à la prochaine version du framework, mais personne ne peut faire la moindre promesse quant à savoir si cela sera ou non implémenté. – Levi

Répondre

4

Avez-vous essayé filtre personnalisé pour cette ?:

public class DefaultsAttribute : ActionFilterAttribute 
{ 
    public string[] DefaultParams; 
    public object[] DefaultValues; 

    public DefaultsAttribute(string[] defaultParams, object[] defaultValues) 
    { 
     DefaultParams = defaultParams; 
     DefaultValues = defaultValues; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var params = filterContext.ActionParameters; 

     for(int i = 0; i < DefaultParams.Length; i++) 
     { 
      if (params.Keys.Any(x => x == DefaultParams[i])) 
      { 
       params[DefaultParams[i]] = DefaultValues[i]; 
      } 
     } 
    } 
} 

l'aide (malheureusement CLR ne permet pas de paramètres d'attributs dynamiques) :

[Defaults(new {"page", "pagesize", "sortby", "sortorder"}, new {1, 10, "ClientInvoiceNumber", "desc"})] 
public ActionResult List(int page, int pagesize, string sortby, string sortorder) { 
    ... 
} 
0

vous pouvez le faire en ajoutant des itinéraires à la table des routes

routes.MapRoute(
       "<RouteName>", 
       "path/to/action{parameter1}", 
       new{controller = "<controller name>", action = "<action name>", 
        parameter1= <default value>}); 
+0

Comme je l'ai dit, je suis conscient de cela, mais je préférerais ne pas avoir à créer un milliard de routes pour chaque action List() que je dois juste définir les paramètres par défaut qui varient légèrement. –

Questions connexes