如何在ASP.NET MVC中设置set per-action参数默认值?

时间:2009-06-16 18:00:32

标签: asp.net-mvc

我正在开发一个在ASP.NET MVC预览2天期间出现的应用程序。它在某些地方非常脏,我正在努力清理它。我试图克服的一个问题是过于冗长的代码。

例如,我有很多方法看起来与此完全相同,但具有不同的默认排序参数。页面和页面大小默认值不会在整个应用中发生变化。

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参数集中添加任何默认参数。

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

2 个答案:

答案 0 :(得分: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) {
    ...
}

答案 1 :(得分:0)

您可以在路线表中添加路线时执行此操作

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