2017-12-12 20 views
0

.NET MVCアプリケーションを.NETコアに移植しています。 Html.RenderPartialを使用して部分をレンダリングするときに問題が発生しています。ViewDataDictionaryモデルが正しく、RenderPartialを呼び出すときに失敗する

関連するコードである:モデル上

<div class="row"> 
     <h2>@WebResources.OtherUsersSavedItems</h2> 
     @foreach (var item in Model.OtherUsersSavedItems) 
     { 
      Html.RenderPartial("SavedItem", Html.ViewDataDictionaryFrom(new { IsLink = true }, item)); 
     } 
    </div> 
OtherUsersSavedItems

プロパティはSavedItem[]として定義されます。そこ以前の私の見解でれるrenderPartialと同じ呼び出し、作品がありますが、違いは、カスタムViewDataDictionaryを使用していないということです。

<div class="row"> 
     <h2>@WebResources.SavedItems</h2> 
     @foreach (var item in Model.SavedItems) 
     { 
      Html.RenderPartial("SavedItem", item); 
     } 
    </div> 

次のようにViewDataDictionaryFromへのコードは次のとおりです。

public static ViewDataDictionary ViewDataDictionaryFrom(this IHtmlHelper helper, object dictionary, object model = null) 
    { 
     if (dictionary == null) 
      return null; 

     // Convert the object to a ViewDataDictionary 
     ViewDataDictionary vdd = new ViewDataDictionary(new Microsoft.AspNetCore.Mvc.ModelBinding.EmptyModelMetadataProvider(), new Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary()); 
     foreach (var property in dictionary.GetType().GetProperties()) 
      vdd.Add(property.Name, property.GetValue(dictionary)); 

     vdd.Model = model; 

     return vdd; 
    } 

前のコードは、.NET MVCで実行しているときにRenderPartialExtensions.RenderPartial(HtmlHelper, Strink, Object, ViewDataDictionary)overloadを使用していて、うまくいきました。 ViewDataDictionaryFromメソッドの.NET MVCと.NET Coreの間には1つの変更がありました。これはモデルを追加し、.NETコアの欠落したオーバーロードを回避するためにそれに合わせて設定しました(vdd.Model = model)。

私が受け取る例外はInvalidOperationException: The model item passed into the ViewDataDictionary is of type 'MyApplication.Models.ListModel', but this ViewDataDictionary instance requires a model item of type 'MyApplication.Models.SavedItem'.です。ListModelは親ビューのものです。

スタックフレームは、(失敗した自分のコードの行から始まる、切り捨て)である:

Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.EnsureCompatible(オブジェクト 値) Microsoft.AspNetCore.Mvc .ViewFeatures.ViewDataDictionary..ctor(ViewDataDictionary ソース、オブジェクト・モデル、タイプdeclaredModelType)lambda_method(閉鎖、 ViewDataDictionary) Microsoft.AspNetCore.Mvc.Razor.Internal.RazorPagePropertyActivator.CreateViewDataDictionary(ViewContext コンテキスト) Microsoft.AspNetCore.Mv c.Razor.Internal.RazorPagePropertyActivator.Activate(オブジェクト ページ、ViewContextコンテキスト) Microsoft.AspNetCore.Mvc.Razor.RazorPageActivator.Activate(IRazorPage ページ、ViewContextコンテキスト) Microsoft.AspNetCore.Mvc.Razor.RazorView + d__16。 MoveNextメソッド() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) Microsoft.AspNetCore.Mvc.Razor.RazorView + d__15.MoveNext() System.Runtime .ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)System.Runtime.CompilerServices。 TaskAwaiter.GetResult() Microsoft.AspNetCore.Mvc.Razor.RazorView + d__14.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) マイクロソフト.AspNetCore.Mvc.ViewFeatures.HtmlHelper + d__60.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) Microsoft.AspNetCore.Mvc.Rendering。 HtmlHelperPartialExtensions.RenderPartial(IHtmlHelper htmlHelper、string partialViewName、ViewDataDictionary viewData) AspNetCore._Views_Index_cshtml + d__0。MoveMext()in Index.cshtml Html.RenderPartial( "SavedItem"、Html.ViewDataDictionaryFrom(new {IsLink = true}、item));

答えて

0

GitHubで入手できるソースコードを調べました。過負荷

public static void RenderPartial(
     this IHtmlHelper htmlHelper, 
     string partialViewName, 
     ViewDataDictionary viewData) 

は、渡されViewDataDictionaryにあるものを無視し、現在のモデルとそれを呼び出すRenderPartialAsyncのラッパーです。

は、私は私のカミソリでRenderPartialAsyncメソッドを使用して、私の問題を修正するにはViewDataDictionaryとモデルの両方を指定することができます。

関連する問題