1

我的模型中有以下内容:

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非空值传入。尽管隐式类型转换已经到位,但MyProfile(OAuthProvider)正在被调用。networknull

我会以错误的方式解决这个问题吗?我是否被迫进行明确的演员表?

4

1 回答 1

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

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

于 2012-04-05T23:16:47.713 回答