【问题标题】:How to setup an asp.net mvc route with two optional parameters, one being a paramarray value?如何设置带有两个可选参数的 asp.net mvc 路由,一个是参数数组值?
【发布时间】:2011-06-10 19:16:36
【问题描述】:

我想做如下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 方法中的可选参数。用户的可选查询字符串将匹配操作方法中的可选数组参数。

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

任何信息将不胜感激。

【问题讨论】:

    标签: asp.net-mvc-2 routes optional-parameters


    【解决方案1】:

    我会定义以下路线:

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

    【讨论】:

      【解决方案2】:

      我最终创建了一个自定义操作过滤器属性,该属性从请求中获取查询字符串用户并将其转换为长列表,然后我将其放入操作参数中。 500 的参数在路由和操作方法中都简单地设置为可选。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 2013-05-24
        • 1970-01-01
        相关资源
        最近更新 更多