2012-07-17 77 views
0

我有一个启用了排序和分页功能的webgrid。我也有一些下拉列表和列表框在同一视图中过滤webgrid的结果。带列表框的mvc3 webgrid过滤器

这些过滤器放在一个带有get方法的表单中。我在过滤器上应用了jquery来提交表单,所以每当过滤器发生变化时,表单都会以url中querystring的形式发回选定的值。当多个值在列表框被选择时,查询字符串产生看起来像

类型= 1种&类型= 3

因此,我创建一个INT []类型接受我的动作的参数。然而,当我排序或页面上的的WebGrid,查询字符串改写为

类型= 1,3 &页= 4

在这种情况下,类型参数变成零,列表框是未选择的和经修正的一个“输入验证错误”类自动。

其实我更喜欢的查询字符串通过的WebGrid

类型产生的风格= 1,3

这样我就可以直接将它传递到我的查询。但是,似乎列表框不喜欢这种查询字符串。有没有办法让列表框识别组合查询字符串或我必须编写代码来处理查询字符串和选定的项目?

回答

1

感谢。我结束了在定制模型绑定

class MultiSelectionBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     string key = bindingContext.ModelName; 
     ValueProviderResult val = bindingContext.ValueProvider.GetValue(key); 
     if (val != null && !string.IsNullOrEmpty(val.AttemptedValue)) 
     { 
      bindingContext.ModelState.SetModelValue(key, val); 

      string incomingString = ((string[])val.RawValue)[0]; 
      if (incomingString.Contains(",")) 
      { 
       var value = new ValueProviderResult(incomingString.Split(','), string.Empty, CultureInfo.InvariantCulture); 
       bindingContext.ModelState.SetModelValue(key, value); 
       return value.ConvertTo(typeof(int[])); 
      } 

      return val.ConvertTo(typeof(int[])); 
     } 

     return null; 
    } 
} 

做类似的工作,并把它应用到参数

public ViewResult Index([ModelBinder(typeof(MultiSelectionBinder))] int[] type, ...) 
0

看起来像WebGrid中的错误。

我会在你的行动开始提出以下解决方法:

if(type == null && !string.IsNullOrWhiteSpace(Request.QueryString["type"])) 
    type=Request.QueryString["type"].Split(',');