如果复杂对象具有从字符串的隐式强制转换,那么QueryString参数是否可以绑定到该复杂对象
本文关键字:对象 复杂 是否 参数 那么 QueryString 绑定 字符串 如果 转换 | 更新日期: 2023-09-27 18:03:24
简短问题:
如果我为我的对象提供了一个隐式转换机制来从纯字符串转换其值,那么它是否可以自动绑定到ViewModel的属性?
详细信息:
我有一个类似的复杂对象(为了简洁明了而简化(
public enum PrimaryScopeEnum {
Pivot1,
Pivot2
}
public enum SecondaryScopeEnum {
Entity1,
Entity2,
Entity3,
Entity4
}
public class DataScope {
public PrimaryScopeEnum PrimaryScope { get; set; }
public SecondaryScopeEnum SecondaryScope { get; set; }
public static implicit operator DataScope ( string combinedScope ) {
DataScope ds = new DataScope();
// Logic for populating Primary and Secondary Scope enums
return ds;
}
}
我在我的视图模型中使用上述对象,如下所示:
public enum PageModeEnum {
View,
Add,
Edit
}
public class DisplayInfoViewModel {
public string SetID { get; set; }
public PageModeEnum PageMode { get; set; }
public DataScope Scope { get; set; }
}
我的控制器中的Action设置为
// Accessed with /MyController/DisplayInfo?SetID=22&PageMode=View&Scope=Pivot1
public virtual ActionResult DisplayInfo ( DisplayInfoViewModel vm ) {
// vm.SetID is 22
// vm.PageMode is PageModeEnum.View
// vm.Scope is null
return View ( vm );
}
我的问题在Action中,尽管我给出了从字符串到DataScope
类的隐式强制转换,但在执行过程中它无法正确绑定。
我已经用正在传递的值(此处为Pivot1(单独测试了铸件,铸件运行良好。
有没有一种方法可以隐式进行这种转换,或者我应该将视图模型Scope
变量更改为纯字符串,然后进行手动转换。
否,默认模型绑定器不使用任何隐式运算符。您必须为DataScope
类型编写一个自定义模型绑定器,并从请求字符串手动绑定它(如果您希望这样做的话(。
例如:
public class DataScopeModelBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value == null)
{
return null;
}
return (DataScope)value.RawValue;
}
}
然后将其与Application_Start
:中的DataScope
类型关联
ModelBinders.Binders.Add(typeof(DataScope), new DataScopeModelBinder());