Я бы определил следующий маршрут:
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)
{
...
}