我正在开发一个在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参数集中添加任何默认参数。
我已经考虑过这个问题了,但是我想把这个问题保持开放性,不要人为地指导特定方向的答案。我意识到默认值可以在路由定义中设置,但我想设置默认的每个操作,而不必创建十亿个路由。
答案 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>});