如果复杂对象具有从字符串的隐式强制转换,那么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变量更改为纯字符串,然后进行手动转换。

如果复杂对象具有从字符串的隐式强制转换,那么QueryString参数是否可以绑定到该复杂对象

否,默认模型绑定器不使用任何隐式运算符。您必须为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());