2009-03-16 10 views
185

私はページ持って渡さ:れるrenderPartialが間違った型

<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %> 

、その上に、以下:

<% Html.RenderPartial("TaskList", Model.Tasks); %> 

ここではDTOオブジェクトです:

public class DTOSearchResults 
{ 
    public string SearchTerm { get; set; } 
    public IEnumerable<Task> Tasks { get; set; } 

ここに部分的にあります:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %> 

Model.Tasksがnullでない場合、すべて正常に動作します。しかし、そのnullは、私が取得するとき:

辞書に渡されたモデルアイテムのタイプが 「DTOSearchResults」ですが、この辞書は「System.Collections.Generic.IEnumerable`1 [タスク]タイプ のモデルアイテムが必要です'

私は、使用するオーバーロードを知ってはいけないと考えたので、これを明示するようにしましたが、私はまだ同じ問題を抱えています!

私はnullをチェックすることで回避することができますか、またはnullを渡すことさえできませんが、それはポイントではありません。なぜこうなった?

答えて

325

Andrew私はあなたが渡しているモデルがnullであるときに、呼び出し側(ビュー)のモデルを部分ビューに使用してRenderPartialメソッドを実行した結果だと思います。 :

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary()); %> 

これは役に立ちますか?

+0

華麗な、素晴らしい作品 –

+1

感謝、感謝!!! – Jason

+0

これは私に多くの時間を節約しました! – Mathlec

22

渡すモデルのプロパティがnullの場合、MVCは意図的に「親」モデルに戻ります。明らかに、MVCエンジンはヌルモデル値を前のものを使用する意図として解釈します。ここ

もう少し詳細:myandmycodeの答え@ASP.NET MVC, strongly typed views, partial view parameters glitch

+1

+1実際にこの問題を説明しようとしていて、ちょうど奇妙な行動としてこれを扱うのではない – YavgenyP

+0

これは私に起こっていて、上記はそれを修正しなかった、ちょうど私に実際のエラーに関する情報を少し与えた。 – Canvas

40

は良いですが、少し短い方がViewDataDictionaryモデルを保持しているもので、それができるので、これは動作します

<% Html.RenderPartial("TaskList", new ViewDataDictionary(Model.Tasks)); %> 

だろうモデルをコンストラクタパラメータとして受け入れます。これは、基本的に、「全体」ビュー・データ・ディクショナリを渡します。もちろん、それはもちろんnullの可能性のあるモデルのみを含みます。コンパイルするときPartial(...)とても便利で、あいまいエラーの前にマッチした

public static MvcHtmlString Partial<T>(this HtmlHelper htmlHelper, string partialViewName, T model) 
{ 
    ViewDataDictionary viewData = new ViewDataDictionary(htmlHelper.ViewData) 
    { 
     Model = model 
    }; 
    return PartialExtensions.Partial(htmlHelper, partialViewName, model, viewData); 
} 

Partial<T>(...)

+0

ViewDataDictionaryコンストラクタにnull値を渡すと、ArgumentNullExceptionがスローされます。 – jcmcbeth

+1

@jcmcbeth:いや、そうではない...私はこの正確なコードをヌルで首尾良く使用しました。 – configurator

+1

@jcmcbeth:あなたは 'new ViewDataDictionary(null)'を使用していますか?それはおそらくヌルを受け入れない 'ViewDataDictionary'パラメータで別のオーバーロードを選択するためです。 – configurator

10

ソリューションは、このようなHtmlHelperのを作成することです。

個人的に私はこの行動を理解することが難しいと思っています。これをデザインの選択肢として想像するのは難しいでしょうか?

+1

これは私が最後にやったことです。 asp.net mvcには何も意味をなさないものがたくさんあります。それを放棄して以来。他の人には役に立ちます。だから+1 –

+0

いいですが、ユーザーにとっては不明です。私が自分の大学のプロジェクトで使っているものに慣れているとしましょう。私は新鮮なものを始めます。そして、このオーバーロードとボイラーを追加することを完全に忘れてしまいました。我々はそれを十分にテストしなかったので、例外が生産から始まります。別の名前はベッターイモです。 – Jaap

11

これが解決しましたが、私はこれを実行し、new ViewDataDictionary()で回避するのではなく、私のプロジェクトでこの問題を解決したいと決めました。

私は、拡張メソッドのセットを作成しました: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
を私はまた、これはif文の多くが保存されます、モデルがnullの場合、部分的に呼び出すことはありませんいくつかのメソッドを追加しました。

私はそれらをRazor用に作成しましたが、それらの2つはaspxスタイルのビュー(HelperResultを使用するものはおそらく互換性がありません)で動作する必要があります。

拡張メソッドは次のようになります。

@* calls the partial with Model = null *@ 
@Html.PartialOrNull("PartialName", null) 
@* does not call the partial if the model is null *@ 
@Html.PartialOrDiscard("PartialName", null) 

IEnumerable<object>モデルや廃棄のもののための方法もあります。また、あなたには、いくつかのHTMLとの部分的な結果をラップすることができカミソリラムダを呼び出すことができます。

好きなように自由に使用してください。

+1

MVC5時点ではまだ役立ちます:2014年6月25日。ありがとう。 – Jason

17

あなたが部分図であなたの以前のViewDataを失いたくない場合は、あなたが試みることができる:これに

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%> 
+1

これは質問に答えないようです。 –

+5

+1実際は動作します。これは、基本的に同じ考え方ですhttp://stackoverflow.com/a/713921/649497しかし、その答えの問題を克服し、空のコンストラクタでViewDataDictionaryをインスタンス化すると、ViewDataが欠落することになります。私はまず、この問題を解決したソリューションで解決し、ValidationSummaryが部分ビューで機能しないことが判明しました。この解決策は私のために解決しました。この解答は、問題を解決し、ViewDataを部分ビューで保存するための認識が必要です。 – BruceHill

+1

@Franc Pこれは実際にViewBag値を失うことなく動作し、したがってヌルモデルを渡しました。ありがとう。 – User

0

私の回避策は次のとおりです。

 

<% Html.RenderPartial("TaskList", Model.Tasks ?? new List()); %> 
 
+0

これは汚い解決策です。あなたの部分的なビューでは、listに値があるかどうか、nullであるかどうかを調べるのではなく、null Modelをチェックできるはずです。 – madd

関連する問題