web-dev-qa-db-ja.com

(PartialView)ディクショナリに渡されたモデルアイテムのタイプは「Customer」ですが、このディクショナリにはタイプ「UserProfile」のモデルアイテムが必要です

@model Customer

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

このコードを実行すると、次のエラーが発生します。

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

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

これらのフィールドを編集できるようにしたい。助言がありますか?

41
Razzer

Model.UserProfileはnullではありません。

あなたの投稿が同じエラーをデバッグしようとしているのを発見し、「Model.UserProfile "相当。

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

94
Murray

Model.UserProfileがnullの場合、顧客モデルを渡そうとします。

これを回避する2つの方法:

@model Customer

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

または:

@model Customer

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

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

他の人が説明したように、nullが渡されると、Html.RenderPartialのオーバーロードがトリガーされ、親ビューモデルがパススルーされます。最終的には、部分ビューを表示テンプレートとエディターテンプレートに変換して回避しました。 Hansleman および codegur からのハウツー記事の一部を以下に示します。

このメソッドを使用すると再利用性が向上し、null値が保持されます。

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

次に、DisplayTemplateでnull値を処理します。

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

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

1
Dashanan

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

これを試して:

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