Asp.net mvc 2 如何使用两个可选参数(一个是paramarray值)设置asp.net mvc路由?

Asp.net mvc 2 如何使用两个可选参数(一个是paramarray值)设置asp.net mvc路由?,asp.net-mvc-2,routes,optional-parameters,Asp.net Mvc 2,Routes,Optional Parameters,我要创建以下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将与您猜测的动作方法中的可选参数匹配。用户的可选querys

我要创建以下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将与您猜测的动作方法中的可选参数匹配。用户的可选querystring将与action方法中的可选数组参数匹配

设置这些设备的最佳方式是什么?一个定制的动作过滤器?两种不同的行动方式?“我的路线”集合中有多个路线条目


任何信息都将不胜感激。

我最终创建了一个自定义actionfilterattribute,它从请求中获取querystring用户,并将其转换为一个long列表,然后将其放入actionparameter中。500的参数在route和actionmethod中都被简单地设置为可选。

我将定义以下路由:

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\u Start
中声明它:

ModelBinders.Binders.Add(typeof(string[]), new StringArrayModelBinder());
然后您的控制器操作将变成:

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