Как настроить asv.net mvc route с двумя необязательными параметрами, один из которых является значением paramarray? - PullRequest
1 голос
/ 10 июня 2011

Я хочу сделать следующие маршруты asp.net mvc:

http://somedomain.com/user/search/500?Users=1,2,3,4
http://somedomain.com/user/search/500
http://somedomain.com/user/search?Users=1,2,3,4
http://somedomain.com/user/search

Пользователь будет соответствовать контроллеру, поиск будет соответствовать методу действия. Необязательный параметр 500 будет соответствовать, как вы уже догадались, необязательному параметру в методе действия. Необязательная строка запроса Users будет соответствовать необязательному параметру массива в методе действия.

Как лучше всего их настроить? Пользовательский атрибут ActionFilterAttribute? Два разных метода действий? Несколько записей о маршрутах в моей подборке маршрутов?

Любая информация будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 11 июня 2011

Я бы определил следующий маршрут:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{someparam}",
    new { controller = "Users", action = "Search", id = UrlParameter.Optional }
);

и затем написал бы пользовательский связыватель модели для строкового массива:

public class StringArrayModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value != null)
        {
            return value.AttemptedValue.Split(',');
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

наконец, я бы определил действие контроллера следующим образом:

public ActionResult Search(
    [ModelBinder(typeof(StringArrayModelBinder))] string[] users, 
    string someparam
)
{
    ...
}

и если вы хотите, чтобы этот пользовательский связыватель модели применялся ко всем действиям, для которых в качестве аргумента действия указан массив строк, вы можете объявить его в Application_Start:

ModelBinders.Binders.Add(typeof(string[]), new StringArrayModelBinder());

и тогда ваше действие контроллера просто станет:

public ActionResult Search(string[] users, string someparam)
{
    ...
}
0 голосов
/ 11 июня 2011

Я закончил тем, что создал собственный атрибут actionfilterattribute, который взял строку запроса Users из запроса и преобразовал ее в список длинных строк, которые я затем поместил в параметр action.Параметр для 500 был просто установлен как необязательный как в маршруте, так и в методе действия.

...