我有一个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属性的值来自别名表单/查询参数?
任何帮助都将不胜感激。
谢谢。
杰森
答案 0 :(得分:2)
在某些情况下,我一直主要重写OnModelUpdated(),我不得不重写BindModel但很少。在OnModelUpdated中,您的模型已经被水合,但您仍然可以以您认为合适的任何方式更改它,并且可以完全访问控制器和ModelBinding上下文。