繁体   English   中英

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

[英]How can I get implicit type conversions from string members of anonymous types to strongly-typed controller actions?

我的 model 中有以下内容:

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 controller 中:

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

这在我看来:

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

其中Model.Network是一个string

呈现此视图时,我可以看到(通过断点) Model.Network作为不是 null 的string传入。正在调用我的Profile(OAuthProvider) ,但network作为null ,尽管隐式类型转换正在进行到位。

我会以错误的方式解决这个问题吗? 我是否被迫进行显式转换?

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

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

在你的Application_Start你做这样的事情......

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

(如果 controller 永远不会到达操作或其他情况,例如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

这里有一个链接快速...
创建自定义 model 活页夹
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultmodelbinder.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM