我怎样才能从匿名类型的字符串成员隐式类型转换到强类型的控制器操作?(How can I get im

2019-10-16 14:02发布

我已经在我的模型如下:

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.Network是一个string

如果这一观点被渲染,我可以看到(通过断点),其Model.Network即将作为一个string不是空。 我的Profile(OAuthProvider)被调用,但network是如来null ,尽管隐式类型转换的到位。

我要对这个错误的方式? 我是被迫做了一个明确的投?

Answer 1:

不知道这可能会奏效,它不是一个直接的答案,你有什么(但它是很难说的w / o在类似案件中调试),但可能会帮助(并且是注释多的文本)...

在类似的情况下,当绑定不能按预期工作,经常帮助调试 - 并通过使自定义粘合剂。

在你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

这里有一个快速链接...
创建自定义的模型绑定
http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultmodelbinder.aspx



文章来源: How can I get implicit type conversions from string members of anonymous types to strongly-typed controller actions?