Как установить параметры по умолчанию для каждого действия в ASP.NET MVC? - PullRequest
1 голос
/ 16 июня 2009

Я работаю над приложением, созданным в течение двухдневного предварительного просмотра 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.

Я думал об этом кое-что, но хотел бы оставить вопрос открытым, чтобы не искусственно направлять ответы в определенном направлении. Я понимаю, что значения по умолчанию можно установить в определениях маршрутов, но я бы хотел установить значения по умолчанию для каждого действия без необходимости создавать миллиард маршрутов.

Ответы [ 2 ]

4 голосов
/ 16 июня 2009

Вы пробовали настраиваемый фильтр для этого?:

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 голосов
/ 16 июня 2009

вы можете сделать это при добавлении маршрутов в таблицу маршрутов

routes.MapRoute(
                "<RouteName>",
                "path/to/action{parameter1}",
                new{controller = "<controller name>", action = "<action name>",
                    parameter1= <default value>});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...