带有列表框的mvc3 webgrid过滤器

时间:2012-07-17 07:52:07

标签: asp.net-mvc listbox webgrid

我有一个启用了排序和分页的webgrid。我在同一视图上也有一些下拉列表和列表框来过滤webgrid结果。

过滤器使用http get方法放置在表单内。我在过滤器上应用了jquery以提交表单,因此每次过滤器更改时,表单都会返回,其中所选值为url中的查询字符串。在列表框中选择多个值时,生成的查询字符串看起来像

类型= 1&安培;类型= 3

所以我创建了一个int []类型来接受我的动作中的参数。但是,当我对webgrid进行排序或分页时,查询字符串会被重写为

类型= 1,3&安培;页= 4

在这种情况下,type参数变为null,列表框未被选中并自动修改为“input-validation-error”类。

我实际上更喜欢webgrid生成的查询字符串的样式

类型= 1,3

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

2 个答案:

答案 0 :(得分: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, ...)

答案 1 :(得分:0)

看起来像WebGrid中的一个错误。

我建议您在行动开始时采取以下解决方法:

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