重複していません: MVC Razor動的モデル、「オブジェクト」には「PropertyName」の定義が含まれていません
そこでの答えによると、
David Ebboによると、匿名型は内部としてコンパイルされるため、動的に型指定されたビューに匿名型を渡すことはできません。 CSHTMLビューは別のアセンブリにコンパイルされているため、匿名型のプロパティにアクセスできません。
部分ビューが「/Home/_Partial.cshtml」にある場合、以下のコード(動作しないはずです)が期待どおりに動作するのに、「/ Shared/_Partial.cshtml」に移動すると突然動作を停止するのはなぜですか?
ASP.NET 4.5(および以前のバージョン)を使用して、以下は「Hello、World!」というテキストを生成します。 Webブラウザへ:
〜/ Controllers/HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace TestDynamicModel.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
〜/ Views/Home/Index.cshtml
@Html.Partial("_Partial", new { Text = "Hello, world!", ShouldRender = true } )
〜/ Views/Home/_Partial.cshtml
@model dynamic
@if (!Model.ShouldRender)
{
<p>Nothing to see here!</p>
}
else
{
<p>@Model.Text</p>
}
ただし、代わりに_Partial.cshtmlを〜/ Views/Shared/_Partial.cshtmlに移動すると、_Partial.cshtmlで次のエラーがスローされます(2行目)。
'object' does not contain a definition for 'ShouldRender'
デバッガーでモデルを調べると、次のプロパティが見つかりました。
Model { Text = Hello, world!, ShouldRender = True }
私はこれがSO回答: https://stackoverflow.com/a/21633464/605067 と同じ症状を持っていた私のエラーの解決策であることがわかりましたエラーメッセージは次のとおりです。
'object' does not contain a definition for 'property'
これは、匿名オブジェクトを{{@ Html.Partial}}に同じ方法で渡した結果です。
その回答で述べられているように、匿名オブジェクトを部分ビューに渡すことは完全に有効であり、それらのビューは{{@model dynamic}}を含める必要はありません-実際にはあなたは動的モデルを使用すると、不要なオーバーヘッドが発生します。
本当の問題は、少なくとも私の場合、このエラーメッセージが誤解を招くことです。問題は、同じディレクトリに正しくコンパイルされなかった他のビューファイルがあり、ビューコンパイラがオフになっているように見えることでした。他のSO postで提供された修正は、*。csprojプロパティを設定することでした。
<MvcBuildViews>true</MvcBuildViews>
trueに設定してから、ビューのすべてのコンパイルエラーを修正します。それらを修正した後、部分ビューで匿名オブジェクトにバインドすることができました。
質問はASP.NETMVCの動作に関するものであり、回避策を認識していますが、全員がそうであるかどうかはわかりません。コードを機能させたいだけの人のための回避策は次のとおりです。 Razorの動的匿名型はRuntimeBinderExceptionを引き起こします