代码之家  ›  专栏  ›  技术社区  ›  Samantha Branham

如何在ASP。网络MVC?

  •  1
  • Samantha Branham  · 技术社区  · 17 年前

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

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

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

    是否有人以一种干净的方式解决了这个问题,或者框架中是否有我根本不知道的东西?如果可能的话,我甚至想将任何默认参数添加到HttpRequestBase参数集合中。

    我已经考虑过这个问题,但我想让这个问题保持开放,以免人为地将答案引导到特定的方向。我意识到可以在路由定义中设置默认值,但我想在不创建十亿条路由的情况下为每个操作设置默认值。

    2 回复  |  直到 17 年前
        1
  •  4
  •   eu-ge-ne    17 年前

    您是否为此尝试了自定义筛选器?:

    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) {
        ...
    }
    
        2
  •  0
  •   Rony    17 年前

    您可以在向路由表添加路由时执行此操作

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