.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));