我有一个需要两个功能的 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 属性的值来自别名表单/查询参数吗?
任何帮助,将不胜感激。
谢谢你。
杰森