ASP.NET MVC '@model dynamic' не распознает свойства модели, когда частичный вид находится в общей папке

Не дубликат: Динамическая модель MVC Razor, "объект" не содержит определения для "PropertyName"

Согласно ответам,

Согласно Дэвиду Эббо, вы не можете передавать анонимный тип в динамически типизированное представление, поскольку анонимные типы скомпилированы как внутренний. Поскольку представление CSHTML скомпилировано в отдельную сборку, он не может получить доступ к свойствам анонимного типа.

Почему код ниже - который, как утверждается, никогда не должен работать, работает так, как я ожидал, когда частичный вид находится в "/Home/_Partial.cshtml", но внезапно перестает работать при перемещении в "/Shared/_Partial.cshtml"?

Используя ASP.NET 4.5 (и предыдущие версии), следующее выдает текст "Hello, World!". в веб-браузер:

~/Контроллеры/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 }

Ответ 2

Я нашел этот ответ SO: fooobar.com/questions/40739/... для решения моей ошибки, которая имела все те же симптомы, что и у вас. Сообщение об ошибке:

'object' does not contain a definition for 'property'

и это было связано с передачей анонимного объекта {{@Html.Partial}} таким же образом, как и вы.

Как указано в этом ответе, вполне допустимо передавать анонимные объекты в частичные представления, и эти представления не должны включать {{@model dynamic}} - на самом деле вы создаете ненужные служебные данные, если используете динамическую модель.

Реальная проблема заключается в том, что это сообщение об ошибке вводит в заблуждение, по крайней мере, в моем случае. Проблема заключалась в том, что у меня были другие файлы представлений в том же каталоге, которые неправильно компилировались, и похоже, что компилятор представления отключен. Исправлено исправление, содержащееся в другом SO-сообщении, которое должно было установить свойство *.csproj

<MvcBuildViews>true</MvcBuildViews>

в true, а затем исправить все ошибки компиляции в моих представлениях. После их исправления я смог связать анонимный объект с частичным представлением.

Ответ 3

Чтобы использовать тип dynamic, вам нужно ссылаться на сборку Microsoft.CSharp. Проверьте ссылки на свой проект.