在自定义模型绑定中应该覆盖哪种方法或属性?

时间:2013-12-16 20:54:07

标签: model-view-controller defaultmodelbinder custom-model-binder

我有一个MVC应用程序的自定义绑定方案,需要两个功能

1)通用,可重复使用的自定义绑定器,允许将表单/查询属性映射到类属性。

2)类特定的自定义绑定器,它将给定的表单/查询参数拆分为字典(或两个属性)。

第一个要求是通过我通过Google找到的解决方案完成的(我很抱歉我无法提供链接,因为我忘记了发现它的位置)。

本质上,有两件

public class BindAliasAttribute : Attribute {
    ...
    public string Alias { get; set; }
    ...
}

使用

public class SearchRequest {
   ...
   [BindAlias("q")]
   public string SearchTerms { get; set; }
   ...
}

第二件是

public class AliasModelBinder : DefaultModelBinder {
   ...
   protected override ProperyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) {
      var returnProps = base.GetModelProperties(controllerContext, bindingContext);

      // check model for properties with alias attribute
      // add additional PropertyDescriptors as needed
   }
   ...
}

我的问题是需求#2。在这种情况下,SearchRequest类还有一个附加属性

public class SearchRequest {
   ...
   [BindAlias("q")]
   public string SearchTerms { get; set; }
   ...
   [BindAlias("s")]
   public IDictionary<string, string> SortOrder { get; set; }
   ...
}

其中Dictionary的键是字段名称,Dictionary项的值是顺序(升序或降序)

使用

的示例
/Search?...s=Score DESC...
/Search?...s=ModifiedDate ASC&s=OwningUser DESC...

我需要绑定表单/查询值的逻辑类似于

// loop through each form/query parameter of SortOrder or s
// get the value and split it on the space
// add thw two split values to the SortOrder property as new dictionary item

我知道我应该再次从DefaultModelBinder继承...或者在这种情况下AliasModelBinder(它继承自DefaultModelBinder)以支持Alias,但我的问题是我不确定要覆盖哪个方法。似乎很少(即几乎没有)重新使用DefaultModelBinder的最佳方法的信息。

我的另一个问题涉及使用两个自定义模型绑定器的最佳方法。据我所知,没有模型粘合剂链。如果没有#2的解决方案明确地知道解决方案#1,我有没有办法完成#2的要求?要求#2关心获取单个值并将其拆分为字典。是否真的关心SortOrder属性的值来自别名表单/查询参数?

任何帮助都将不胜感激。

谢谢。

杰森

1 个答案:

答案 0 :(得分:2)

在某些情况下,我一直主要重写OnModelUpdated(),我不得不重写BindModel但很少。在OnModelUpdated中,您的模型已经被水合,但您仍然可以以您认为合适的任何方式更改它,并且可以完全访问控制器和ModelBinding上下文。