202

私はページを持っています:

<%@ 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[Task]' のモデル アイテムが必要です。

どのオーバーロードを使用すればよいかわからないと考えたので、明示的にこれを行いました (以下を参照) が、それでも同じ問題が発生します!

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

null をチェックするか、null を渡さなくても、これを回避できることはわかっていますが、それは重要ではありません。なぜこうなった?

4

7 に答える 7

351

アンドリューあなたが得ている問題は、渡すモデルがnullのときに、RenderPartialメソッドが呼び出し(ビュー)のモデルを部分ビューに使用した結果だと思います..次のようにして、この奇妙な動作を回避できます。

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

それは役に立ちますか?

于 2009-04-03T13:32:52.337 に答える
48

@myandmycodeの答えは良いですが、少し短いものは

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

これが機能するのViewDataDictionaryは、 がモデルを保持するものであり、モデルをコンストラクター パラメーターとして受け入れることができるためです。これは基本的に、「全体」のビュー データ ディクショナリを渡します。これにはもちろん、null の可能性があるモデルのみが含まれます。

于 2011-03-15T15:14:17.523 に答える
28

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

ここでもう少し詳しく: ASP.NET MVC、厳密に型指定されたビュー、部分的なビュー パラメーターの不具合

于 2010-07-30T16:35:11.687 に答える
20

部分ビューで以前の ViewData を失いたくない場合は、次を試すことができます。

<% Html.RenderPartial("TaskList", Model.Tasks, new ViewDataDictionary(ViewData){Model = null});%>
于 2012-08-20T12:23:52.077 に答える
12

解決策は、次のような HtmlHelper を作成することです。

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>(...)に一致しました。Partial(...)

個人的には動作を理解するのが難しいと思います-これを設計上の選択として想像するのは難しいですか?

于 2011-11-29T17:21:01.580 に答える
11

これには回答がありましたが、私はこれに出くわし、プロジェクトでこの問題を回避するのではなく、この問題を解決したいと決めましたnew ViewDataDictionary()

一連の拡張メソッドを作成しました: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
また、モデルが null の場合にパーシャルを呼び出さないメソッドもいくつか追加しました。 、これにより多くの if ステートメントが節約されます。

私は Razor 用に作成しましたが、いくつかは 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>あり、破棄されたものは Razor ラムダで呼び出すこともでき、部分的な結果を HTML でラップできます。

よろしければご自由にお使いください。

于 2012-04-21T11:41:10.517 に答える
1

これに対する私の回避策は次のとおりです。


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

于 2015-01-21T07:57:20.047 に答える