如何从匿名类型的字符串成员到强类型控制器操作获得隐式类型转换?

时间:2012-04-05 22:34:43

标签: c# asp.net-mvc-3

我的模型中有以下内容:

public sealed class OAuthProvider
{
    private readonly string name;

    private const string SOME_PROVIDER = "SOMEPROVIDER";
    public static readonly OAuthProvider SomeProvider = new OAuthProvider(SOME_PROVIDER);

    private OAuthProvider(String name) { this.name = name; }
    public override String ToString(){ return name; }
    public static implicit operator string(OAuthProvider oAuthProvider)
    {
        return oAuthProvider.name;
    }
    public static implicit operator OAuthProvider(string oAuthProvider)
    {
        switch (oAuthProvider)
        {
            case SOME_PROVIDER : return SomeProvider ;
            default: return null;
        }
    }
}

这在我的OAuth控制器中:

public ActionResult Profile(OAuthProvider network)
{...}

这在我看来:

@model SomeModel
Html.RenderAction("Profile", "OAuth", new { network = Model.Network });

Model.Networkstring

的位置

当渲染此视图时,我可以看到(通过断点)Model.Network作为非{null的string进入。我的Profile(OAuthProvider)被调用,但networknull进入,尽管隐式类型转换已到位。

我是以错误的方式来做这件事的吗?我被迫做一个明确的演员吗?

1 个答案:

答案 0 :(得分:1)

不确定这是否可行,它不是你所拥有的直接答案(但在类似的情况下很难说没有调试)但可能有所帮助(并且评论的文字很多)......

在类似的情况下,当绑定不能按预期工作时,通常有助于调试 - 以及通过制作自定义绑定器。

Application_Start你做了类似的事情......

ModelBinders.Binders.Add(typeof(YourNamespace.OAuthProvider), new YourNamespace.Binders.OAuthProviderClassBinder());

(如果控制器永远不会到达操作或其他情况,例如ControllerBuilder.Current.SetControllerFactory(new RedirectControllerFactory());工厂派生自DefaultControllerFactory,类似于下面的例子,你也可以这样做)

...然后在代码中的某个地方定义像这样的绑定器,简化......

public class OAuthProviderClassBinder : DefaultModelBinder
{
    //public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    //{
    //}
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var model = (OAuthProvider)base.CreateModel(controllerContext, bindingContext, modelType);

        // ...you change, inspect set etc.

        return model;
    }
}

...这是自定义绑定的方式,调整你的'传递'值 - 也检查它们是否有问题等。
你可能最好覆盖其他方法,例如BindModel

这是一个快速链接...
Creating a custom model binder
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultmodelbinder.aspx