0

我有一个需要两个功能的 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 属性的值来自别名表单/查询参数吗?

任何帮助,将不胜感激。

谢谢你。

杰森

4

1 回答 1

2

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

于 2013-12-16T21:04:08.600 回答