0

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

过滤器放置在带有 http get 方法的表单中。我在过滤器上应用了 jquery 来提交表单,所以每次当过滤器更改时,表单都会以所选值作为 url 中的查询字符串发回。在列表框中选择多个值时,生成的查询字符串如下所示

类型=1&类型=3

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

类型=1,3&page=4 ,

在这种情况下,类型参数变为空,列表框将被取消选择并自动使用“输入验证错误”类进行修改。

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

类型=1,3

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

4

2 回答 2

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, ...)
于 2012-08-22T01:56:36.963 回答
0

看起来像 WebGrid 中的错误。

我会在您的操作开始时建议以下解决方法:

if(type == null && !string.IsNullOrWhiteSpace(Request.QueryString["type"]))
    type=Request.QueryString["type"].Split(',');
于 2012-08-08T19:34:04.883 回答