2009-06-16 31 views
1

我正在研究ASP.NET MVC预览2天期间生成的应用程序。这是很脏的地方,我试图清理它。我试图克服的一个问题是过于冗长的代码。如何在ASP.NET MVC中设置每个动作参数的默认值?

例如,我有很多方法看起来像这样,但具有不同的默认排序参数。页面和页面大小默认值不会在整个应用程序中更改。

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(); 
} 

现在最好,C#会支持这样的事情:

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

当然不过,这种情况并非如此。

在ASP.NET MVC中,我会在哪里编写一些代码来设置基于每个操作的默认参数,而不是每个路由?有没有人以干净的方式解决了这个问题,还是有东西烘焙到我根本不知道的框架中?如果可能,我甚至想将任何默认参数添加到HttpRequestBase参数集合中。

我已经考虑过这个问题了,但是希望将问题放在开放式的地方,而不是人为地指导特定方向的答案。我意识到可以在路由定义中设置默认值,但是我想设置每个操作的默认值,而不必创建十亿条路线。

+0

您必须继承ControllerActionInvoker并重写GetParameterValue()方法。有一个公开的请求为[DefaultValue]添加对下一个版本的框架的支持,但是没有人能够做出任何承诺,确定它是否会被实现。 – Levi 2009-06-16 18:16:38

回答

4

你尝试定制过滤器为这个?:

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]; 
      } 
     } 
    } 
} 

使用它(不幸的是CLR不允许动态属性参数) :

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

你能做到这一点的同时添加路由到路由表

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

就像我说的,我意识到这一点,但我宁愿不必为每个List()操作创建十亿个路由,我只需设置稍有不同的默认参数即可。 – 2009-06-16 18:10:42

相关问题