2013-05-10 13 views
33
@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 

私はこのコードを実行すると、私はこのエラーを取得:(PartialView)モデルアイテムは、「顧客」タイプであるが、この辞書は、タイプのモデルアイテムが必要です「のUserProfile」

The model item passed into the dictionary is of type 'Customer', but this dictionary requires a model item of type 'UserProfile'. 

部分ビュー_UserProfileは厳密に型指定されています。

これらのフィールドを編集したいと考えています。 提案がありますか?

+0

また、Html.ActionとHtml.Partialの違いを確認すると便利です。https://stackoverflow.com/questions/16886585/html-partial-skips-the-controller-action –

答えて

72

Model.UserProfileがnullでないことを確認してください。

あなたのポストが同じエラーをデバッグしようとしていて、「Model.UserProfile」という同等のものを初期化していないことが判明しました。

ここで起こっていることは、nullモデルがRenderPartialに渡された場合、デフォルトでメインビューのモデルを使用していることでしょうか?誰でもこれを確認できますか?

+18

あなたは正しいです。これはオーバーロードに関する問題です。 Modelを 'null'として渡して' @ Html.Partial()を呼び出そうとすると、実装はあなたがビューの名前だけを受け入れるメソッドバージョンを呼び出したとみなし、現在のビューモデルを部分的な見方。 – Lafi

+0

はい、あなたは正しいです!ほとんどの場合、これを修正するには、ViewModelコンストラクタにPropertyThatWasNull = new YourObject()を追加します。 nullのUserProfileオブジェクトではもっと難しいかもしれません。 – jwize

+1

MVCの厄介なバグ。ちょうどヒットしましたが、チップのおかげです。 – Alejandro

-1

CustomerタイプのオブジェクトをUserProfileタイプのオブジェクトに大文字で入力しようとしています。デフォルトでは、フレームワークはこれらのオブジェクトをどのようにキャストするか分かりません。

public static explicit operator Digit(byte b) // explicit byte to digit conversion operator 
{ 
    Digit d = new Digit(b); // explicit conversion 

    System.Console.WriteLine("Conversion occurred."); 
    return d; 
} 

あなたはそれhere詳細を読むことができます:あなたは絶対にそれをこのようにしなければならない場合の唯一のオプションは以下のように明示的なキャスト演算子を提供することです。

+0

プロパティUserProfileのキャストがあります。この場合、私はそれが不要であるべきだと思っていますが、これはコンパイラに渡している型を明示的に示しているようです。 – avantprime

-1

キーワード「virtual」をCustomerモデルのUserProfileプロパティに追加します。 それはeasyest方法は遅延ロードが、パフォーマンス...

18

Model.UserProfileがnullの場合、それはあなたの顧客モデルに合格しようとしますが克服されます。これを回避するために

二つの方法:

@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile, new ViewDataDictionary()) 

または:

@model Customer 

if (Model.UserProfile != null) 
{ 
    @Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 
} 
+0

2つ目はうまくいかず、守備的なキャストを使う必要があります。 '@ Html.Partial(" _ UserProfile "、UserProfileというモデル)' – Echilon

+0

@Echilon:あなたはそうです。あなたの提案。しかし、答えの最初のオプションは問題を解決します。 – musefan

+0

2番目のモデルは、モデルがnullの場合に部分ビューをスキップするように設計されています。この例では、ユーザープロファイルがないときにUserProfileビューを表示すると便利ではない場合があります。これはエラーを回避します。 – Kcoder

0

渡されたアイテムがnullの場合は、初期モデルにフォールバックします。

はこれを試してみてください:

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile()) 
1

な名前とアドレスレコードなどのユーザープロファイルの部品を扱うとき、私はこの問題に遭遇しました。ユーザーが不完全なプロファイルを持っている場合は、アカウント管理ビューで空白のアドレスレコードを検出し、アクションリンクを表示して新しいアドレスを作成するか、または使用可能なアドレスデータを表示します。

nullが渡されたときに他に説明されているように、Html.RenderPartialのオーバーロードがトリガーされ、親View Modelが渡されます。私は部分的なビューを表示とエディタのテンプレートに変換して、それを回避しました。Hanslemancodeguru

あなたは、このメソッドからの再利用性良く取得し、それがnull値を保持する:あなたのビューで :

@Html.DisplayFor(m=> m.Address) 

はその後にNULL値を扱うここからハウツー記事いくつか紹介しますDisplayTemplate

@model Namespace.Models.MyObject 
... 
if(@Model != null){ 
... 
}else{ 
... 
} 
+1

この問題の独自のバージョンを解決しようとしたすべての方法のうち、これがはるかに優れていました。 ViewDataとModelState(ModelStateエラーなどを含む)はすべてこれで正常に渡されます。他のソリューションのほとんどは、ModelStateをねじ込む新しいViewDataオブジェクトを渡します。 – mikeschuld

+0

厳密に@mikeschuld実際にあなたのモデルがnullのときに、エラー処理を徹底的に取り入れて新しいオブジェクトをキャストしたいのですが?それが処理されるべき状態を処理するだけです。公平で、私はHtml.Partialを使う方法だった質問に答えなかった。あなたのオブジェクトがnullである可能性がある場合、私はちょうどそれを使わないと言った。 – reachingnexus

0

私は同じ問題に直面しましたが、最終的に私はそれを理解しました。 渡されたモデルに型の不一致があります。ビューにはタイプCustomerのモデルが受け入れられますが、部分ビューはモデルUserprofileを渡しているので、両方で同じモデルを渡すか、または....モデルを作成します両方のモデルのすべてのプロパティ。確かにあなたの問題は解決されるでしょう。

関連する問題