2011-02-08 12 views
1

私はaccountRequestクラスを処理するためのカスタムモデルバインダーを用意しています。 このクラスは、いくつかのブール値とUserViewModelで構成されています。.netのModelBinding複雑なオブジェクトのヘルプ

UserViewModelは、Firstname、Last Name、Addressなどの文字列で構成されています。

元々、私はUserViewModelをアクションパラメータとして渡していましたが、今はaccountRequest内にUserViewModelをパッケージ化する必要があります。

しかし、私のmodelbinderは、httpContext.Requestの文字列をAccountRequest内の自分のUserViewModelにマップしません。すべてのブール値はうまくマップされます。

データをハードコーディングする以外の方法でUserViewModelプロパティにマップする簡単な方法はありますか?

私はこれを試みましたが、私はそれが好きではありません。

Dim accountRequest As New AccountRequest 
Dim user As New UserViewModel 

If Not String.IsNullOrEmpty(controllerContext.HttpContext.Request("Firstname")) Then 
    user.FirstName = controllerContext.HttpContext.Request("Firstname") 
End If 

accountRequest.CurrentUser = user 
Return accountRequest 

明らかに助けていただければ幸いです。前もって感謝します!

答えて

0

申し訳ありません - ちょうどあなたのコードはVBだったことに気づき、私はC#で答えてきた

モデルバインダーは、以前、ValueProviders内だけではなくpropertymodelname.propertyを見て、されるので、これは可能性があり、それは直接アクションメソッドのパラメータだったので、ちょうどpropertyを探していたでしょう。

今モデルタイプが別のメンバーであることを、そのプロパティ名が接頭辞として使用され、私はあなたが(その要件を削除することができますパラメータにBind(Prefix="")を試みることができるが、私はしませんとは思わないそれは働くと思う)。

これは、すべてのプロパティをカスタムバインドしていないことと、DefaultModelBinderがこれらのプロパティの一部を行っていることを前提としています。

コードを変更せずに、クエリ文字列を?modelname.property=[value]に変更することで、動作させることができます。フォームを使用している場合は、Html.EditorFor拡張メソッドの使用を検討する必要があります。これは、ViewModelメンバー名と入力モデル名が一致している限り、モデルの名前付けを処理するためです。 objプレフィックスはとにかく暗黙的であるため、/Index?Nested.StringValue=hello%20world:しかし、クエリ文字列から例として:

public class MyObject{ 
    public string StringValue { get; set; } 
} 

public class MyObjectOuter{ 
    public MyObject Nested { get; set; } 
} 

public ActionResult Index(MyObjectOuter obj); 

obj.Nested.StringProperty値を充填することができます。

あなたがこれを気に入らない場合は、オプションのカップルがあります

1)二つのパラメータ取るためにメソッドのシグネチャを変更します。すぐにあなたを

public ActionResult Index(MyObjectOuter outer, MyObject nested) 

をそしてボディにnestedobj.Nestedプロパティにコピーします。これはちょっとハッキリですが、うまくいくでしょう。

からのクラスのプロパティのバインドを強制的に強制的に強制します(ただし、特定のタイプのリクエストのみで動作するモデルタイプを制限しています。 。

3)または、前述のように、これらのプロパティがHttpフォームからバインドされている場合は、Html.EditorForを使用してマークアップを生成します。入力から自動的に正しい名前の入力が生成されます - >出力。

関連する問題