繁体   English   中英

部分视图位于共享文件夹中时,ASP.NET MVC“@model dynamic”无法识别模型属性

[英]ASP.NET MVC '@model dynamic' not recognizing Model properties when partial view is in Shared folder

不重复: MVC Razor动态模型,'object'不包含'PropertyName'的定义

根据那里的答案,

根据David Ebbo的说法,您无法将匿名类型传递给动态类型视图,因为匿名类型被编译为内部类型。 由于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();
        }
    }
}

〜/浏览/首页/ Index.cshtml

@Html.Partial("_Partial", new { Text = "Hello, world!", ShouldRender = true } )

〜/浏览/首页/ _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时,我发现以下属性:

Model { Text = Hello, world!, ShouldRender = True }

虽然这个问题与ASP.NET MVC的行为有关,而且我知道解决方法,但我不确定每个人都是。 对于只想让代码工作的人来说,这是一种解决方法: Razor中的动态匿名类型导致RuntimeBinderException

我找到了这个答案: https//stackoverflow.com/a/21633464/605067是我的错误的解决方案,它与你的症状有着相同的症状。 错误消息是:

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

这是因为你以同样的方式将一个匿名对象传递给{{@ Html.Partial}}。

如该回答说,这是完全有效的匿名对象传递到局部视图,以及这些观点并不需要包括{{@model动态}} -实际上,你创造一些不必要的开销,如果您使用的是动态模型。

真正的问题是这个错误信息是误导性的 ,至少在我的情况下。 问题是我在同一目录中有其他视图文件没有正确编译,它似乎抛出了视图编译器。 在其他SO帖子中提供的修复工作,即设置* .csproj属性

<MvcBuildViews>true</MvcBuildViews>

为true,然后修复我的视图中的所有编译错误。 修复它们之后,我能够在局部视图中绑定到匿名对象。

要使用dynamic类型,您需要引用Microsoft.CSharp程序集。 检查项目的参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM