2

WebGridページネーション リンクは、1 つを除いてすべての場合で適切に機能します (私が気付きました)。

CheckBoxForMVC で使用すると、状態を処理できるように、同じフィールドに対してinput[type=hidden]とが作成されます。input[type=check-box]したがって、名前付きのフィールドがXあり、メソッドでフォームを送信するGETと、次のような URL になります。

http://foo.com?X=false&X=true

デフォルトのモデル バインダーは、これらの複数のインスタンス OSXを理解し、その値を把握できます。

この問題は、ページ番号を付けようとすると発生しますWebGrid。その動作は、現在のリクエスト パラメータをキャッチして、ページネーション リンクでそれらを再渡そうとすることです。ただし、 が複数あるため、期待されるorの代わりにX渡されます。X=false,trueX=falseX=false&X=true

X=false,trueうまく結べないので問題です。アクションの開始前に、モデル バインダーで例外がトリガーされます。

私はそれを解決できる方法はありますか?

編集:

非常に具体的な問題のように思えますが、そうではありません。チェック ボックスのあるほぼすべての検索フォームは、WebGrid のページネーションを壊します。(GET を使用している場合)

編集2:

私の唯一の2つのオプションは次のとおりだと思います。

  • ページネーション リンクのパラメーターを渡す際により巧妙な独自の WebGrid ページャーを構築する
  • false,true有効であると理解する独自のブール モデル バインダーを構築する
4

3 に答える 3

5

説明されている問題に他の誰かが苦しんでいる場合は、次のようなカスタム モデル バインダーを使用してこれを回避できます。

public class WebgridCheckboxWorkaroundModelBinder : DefaultModelBinder
{
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
    {
        if (propertyDescriptor.PropertyType == typeof (Boolean))
        {
            var value = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
            if (value.AttemptedValue == "true,false")
            {
                PropertyInfo prop = bindingContext.Model.GetType().GetProperty(propertyDescriptor.Name, BindingFlags.Public | BindingFlags.Instance);
                if (null != prop && prop.CanWrite)
                {
                    prop.SetValue(bindingContext.Model, true, null);
                }
                return;
            }
        }

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }
}
于 2012-12-05T16:06:32.317 に答える