2

私は次のことをしようとしています。

デフォルトのモデル バインダーを使用して、クエリ文字列値からオブジェクトをバインドします。
それが失敗した場合は、Cookie 値からオブジェクトをバインドしようとします。

ただし、このオブジェクトでデータ注釈を使用しており、次の問題があります。

  1. クエリ文字列パラメーターがない場合、既定のモデル バインダーは必須フィールドの検証エラーを登録しません。プロパティ自体がクエリ文字列コレクションに含まれていない場合、これらのバリデーターも起動しないようです。この動作を変更するにはどうすればよいですか? クエリ文字列に含まれていない場合、必須フィールドをエラーにしたいと思います。
  2. モデルの検証エラーが発生した場合は、Cookie からモデルを読み込み、オブジェクトを再検証したいと考えています。自分で入力したオブジェクトをモデル バインダーで検証する方法がわかりません。

これが私がこれまでに持っているものです。

    public class MyCarBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var myCar = base.BindModel(controllerContext, bindingContext);

        if (!bindingContext.ModelState.IsValid)
        {
            myCar = MyCar.LoadFromCookie();
            // Not sure what to do to revalidate
        }

        return myCar;
    }
}

これを適切に行う方法についての助けをいただければ幸いです。

4

1 に答える 1

4

まあ、私はそれを自分で解決しました。誰かがコメントを持っているか、それを使いたい場合に備えて、ここにソリューションを投稿してください。

 public class MyCarBinder : DefaultModelBinder
 {
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var queryStringBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new QueryStringValueProvider(controllerContext),
            ModelState = new ModelStateDictionary()
        };

        var myCar = base.BindModel(controllerContext, queryStringBindingContext);

        if (queryStringBindingContext.ModelState.IsValid)
            return myCar;

        // try to bind from cookie if query string is invalid
        var cookieHelper = new Helpers.ControllerContextCookieHelper(controllerContext);
        NameValueCollection nvc = cookieHelper.GetCookies(Helpers.CookieName.MyCar);

        if (nvc == null)
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }

        var cookieBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new NameValueCollectionValueProvider(nvc, CultureInfo.InvariantCulture),
            ModelState = new ModelStateDictionary()
        };

        var myCarFromCookie = base.BindModel(controllerContext, cookieBindingContext);

        if (cookieBindingContext.ModelState.IsValid)
        {
            MyCar temp = myCarFromCookie as MyCar;
            if (temp != null)
                temp.FromCookie = true;

            return myCarFromCookie;
        }
        else
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }
    }
}
于 2010-02-14T16:40:31.340 に答える