Ответ 1
Пока вопрос касается поведения ASP.NET MVC, и я знаю об обходных решениях, я не уверен, что все есть. Вот обходной путь для тех, кто просто хочет, чтобы их код работал: Динамический анонимный тип в Razor вызывает RuntimeBinderException
Не дубликат: Динамическая модель 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 }
Пока вопрос касается поведения ASP.NET MVC, и я знаю об обходных решениях, я не уверен, что все есть. Вот обходной путь для тех, кто просто хочет, чтобы их код работал: Динамический анонимный тип в Razor вызывает RuntimeBinderException
Я нашел этот ответ SO: fooobar.com/questions/40739/... для решения моей ошибки, которая имела все те же симптомы, что и у вас. Сообщение об ошибке:
'object' does not contain a definition for 'property'
и это было связано с передачей анонимного объекта {{@Html.Partial}} таким же образом, как и вы.
Как указано в этом ответе, вполне допустимо передавать анонимные объекты в частичные представления, и эти представления не должны включать {{@model dynamic}} - на самом деле вы создаете ненужные служебные данные, если используете динамическую модель.
Реальная проблема заключается в том, что это сообщение об ошибке вводит в заблуждение, по крайней мере, в моем случае. Проблема заключалась в том, что у меня были другие файлы представлений в том же каталоге, которые неправильно компилировались, и похоже, что компилятор представления отключен. Исправлено исправление, содержащееся в другом SO-сообщении, которое должно было установить свойство *.csproj
<MvcBuildViews>true</MvcBuildViews>
в true, а затем исправить все ошибки компиляции в моих представлениях. После их исправления я смог связать анонимный объект с частичным представлением.
Чтобы использовать тип dynamic
, вам нужно ссылаться на сборку Microsoft.CSharp
. Проверьте ссылки на свой проект.