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

时间:2011-06-10 19:16:36

标签: 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将匹配您猜测它是action方法中的可选参数。 Users的可选查询字符串将匹配action方法中的可选数组参数。

设置这些内容的最佳方法是什么?自定义ActionFilterAttribute?两种不同的行动方式?我的routescollection中有多个路由条目?

任何信息都将不胜感激。

2 个答案:

答案 0 :(得分:3)

我会定义以下路线:

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)
{
    ...
}

答案 1 :(得分:0)

我最终创建了一个自定义actionfilterattribute,它从请求中获取了查询字符串用户并将其转换为longs列表,然后将其放入actionparameter中。 500的参数在路由和actionmethod中都被设置为可选。