如果我已经为我的对象提供了一个隐式转换机制来转换普通字符串的值,那么它是否可以自动绑定到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; }}
我的控制器中的 *** 作设置为
// Accessed with /MyController/displayInfo?SetID=22&PageMode=VIEw&Scope=Pivot1public 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变量更改为plain string然后进行手动转换.
解决方法 不,默认模型绑定器不使用任何隐式运算符.您必须为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());总结
以上是内存溢出为你收集整理的c# – 如果复杂对象具有来自字符串的隐式转换,则QueryString参数是否可以绑定到复杂对象全部内容,希望文章能够帮你解决c# – 如果复杂对象具有来自字符串的隐式转换,则QueryString参数是否可以绑定到复杂对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)