2012-03-04 24 views
5

我正在使用远程加载数据的Telerk Kendo UI网格。传递到我的行动方法QueryString看起来是这样的: -绑定具有MVC数组的QueryString

take=10&skip=0&page=1&pageSize=10&sort[0][field]=value&sort[0][dir]=asc 

我试图找出如何将sort参数绑定到我的方法是什么?是否可能或者是否需要手动枚举QueryString集合或创建自定义绑定?

到目前为止,我已经试过这样: -

public JsonResult GetAllContent(int page, int take, int pageSize, string[] sort) 

public JsonResult GetAllContent(int page, int take, int pageSize, string sort) 

但排序总是空。有谁知道我能做到这一点?

我可以回退到Request.QueryString使用,但这是一个kludge位。

var field = Request.QueryString["sort[0][field]"]; 
var dir = Request.QueryString["sort[0][dir]"]; 

回答

7

你可以使用词典的数组:

public ActionResult Index(
    int page, int take, int pageSize, IDictionary<string, string>[] sort 
) 
{ 
    sort[0]["field"] will equal "value" 
    sort[0]["dir"] will equal "asc" 
    ... 
} 

,然后定义自定义模型绑定:

public class SortViewModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var modelName = bindingContext.ModelName; 
     var keys = controllerContext 
      .HttpContext 
      .Request 
      .Params 
      .Keys 
      .OfType<string>() 
      .Where(key => key.StartsWith(modelName)); 

     var result = new Dictionary<string, string>(); 
     foreach (var key in keys) 
     { 
      var val = bindingContext.ValueProvider.GetValue(key); 
      result[key.Replace(modelName, "").Replace("[", "").Replace("]", "")] = val.AttemptedValue; 
     } 

     return result; 
    } 
} 

将在Global.asax中注册:

ModelBinders.Binders.Add(typeof(IDictionary<string, string>), new SortViewModelBinder()); 
+0

谢谢Darin,这是我的原因之一ve堆栈溢出。 – Rippo 2012-03-04 20:50:23

+0

使用IDictionary数组捕获排序标准是迄今为止我在网上找到的最干净的实现。谢谢。 – YYL 2012-11-14 19:22:32