7

简短的问题:

如果我已经为我的对象提供了一种隐式转换机制,可以将其值从纯字符串转换,那么它可以自动绑定到 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=Pivot1
public virtual ActionResult DisplayInfo ( DisplayInfoViewModel vm ) {
    // vm.SetID is 22
    // vm.PageMode is PageModeEnum.View
    // vm.Scope is null
    return View ( vm );
}

我的问题出在操作中,即使我已经给出了从字符串到DataScope类的隐式转换,它在执行期间无法正确绑定。

我已经分别使用正在传递的值(此处为 Pivot1)测试了铸件,并且铸件工作正常。

有没有办法让这种转换隐式发生,或者我应该将视图模型Scope变量更改为纯字符串,然后进行手动转换。

4

1 回答 1

3

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

然后您将与DataScope您的类型相关联Application_Start

ModelBinders.Binders.Add(typeof(DataScope), new DataScopeModelBinder());
于 2013-03-11T13:37:58.583 回答