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

このビューがレンダリングされると、(ブレークポイントを介して) null ではないModel.Networkとして入ってくることがわかります。stringMyProfile(OAuthProvider)が呼び出されていますが、暗黙的な型変換が行われているにもかかわらず、network入ってきています。null

私はこれについて間違った方法で進んでいますか?明示的なキャストを行う必要がありますか?

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 に答える