0

並べ替えとページングが有効になっている webgrid があります。また、WebGrid の結果をフィルタリングするために、同じビューにいくつかのドロップダウン リストとリストボックスがあります。

フィルターは、http get メソッドを使用してフォーム内に配置されます。フィルターに jquery を適用してフォームを送信したため、フィルターが変更されるたびに、選択した値が URL のクエリ文字列としてフォームに返されます。リストボックスで複数の値が選択されている場合、生成されるクエリ文字列は次のようになります

タイプ=1&タイプ=3

そのため、アクションでパラメーターを受け入れる int[] 型を作成しました。ただし、webgrid をソートまたはページングすると、クエリ文字列が次のように書き換えられます。

タイプ=1,3&ページ=4 ,

この場合、型引数が null になり、リストボックスが選択解除され、「input-validation-error」クラスで自動的に修正されます。

私は実際には 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 に答える