0

ここでBindModelからnullが返される理由を理解するのに苦労しています。私は拡張している属性を持っていますActionFilterAttribute...

public class MyCachedAttribute : ActionFilterAttribute
{
  private IModelBinder binder = new DefaultModelBinder();
  private Type model;

  public MyCachedAttribute(Type model)
  {
     this.model = model;
  }

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
     ModelBindingContext bindingContext = new ModelBindingContext()
     {
        ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, model),
        ModelName = model.Name,
        ModelState = filterContext.Controller.ViewData.ModelState,
        ValueProvider = filterContext.Controller.ValueProvider
     };

     object data = binder.BindModel(filterContext.Controller.ControllerContext, bindingContext);

このdata時点で はnullです。

編集:私はこれに戻ってきて、メソッドが通常渡されたモデルを持っていないため、ModelState空であることに気付きましnullた(したがって、それを拾うためにこの状況で拘束しているのです)。

  [MyCached(typeof(FooViewModel))]
  public ActionResult Foo()
  {
     return PartialView(new FooViewModel());
  }

私が持っているタイプの を生成し、ModelStateそれをバインダーに渡すにはどうすればよいですか? 問題が発生するため、モデルを入力パラメーターとして追加しないようにしていますが、これが引き続き問題になる場合は、代わりにそれらの問題を並べ替える必要があるようです。

ありがとう。

Edit2: ここで ActionFilterAttribute を使用して、状況によっては応答として送信されるモデルを変更し、他の状況ではモデルを受け入れてキャッシュで更新します。この場合、バインドする必要があります。

4

1 に答える 1

2

modelbinder でモデル バインドを行う必要があります。ActionFilter ではありません。ActionFilters は、リクエストとレスポンスをインターセプトして変更するためのものです。したがって、このように ActionResult をクリーンアップします。

public ActionResult Foo(FooViewModel model)
{
    return PartialView(model);
}

次に、カスタム モデル バインダーを作成します。

public class CachedModelBinder : DefaultModelBinder {

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
    object data = base.BindModel(controllerContext, bindingContext);
    // data is not null anymore. You can do your custom stuff now, then return the model
    return data;
}

そしてそれをApplication_Start()あなたのglobal.asax.cs

ModelBinders.Binders.Add(typeof(FooViewModel), new CachedModelBinder());
于 2013-02-27T18:24:59.563 に答える