web-dev-qa-db-ja.com

ASP.NET MVC '@ model dynamic'部分ビューが共有フォルダーにある場合、モデルのプロパティを認識しません

重複していません: 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 }
12
user1630889

私はこれが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に設定してから、ビューのすべてのコンパイルエラーを修正します。それらを修正した後、部分ビューで匿名オブジェクトにバインドすることができました。

1
crimbo

質問はASP.NETMVCの動作に関するものであり、回避策を認識していますが、全員がそうであるかどうかはわかりません。コードを機能させたいだけの人のための回避策は次のとおりです。 Razorの動的匿名型はRuntimeBinderExceptionを引き起こします

1