【问题标题】:View is displaying "System.Data.Entity.DynamicProxies..." instead of actual Child data视图显示“System.Data.Entity.DynamicProxies ...”而不是实际的子数据
【发布时间】:2013-03-24 00:54:41
【问题描述】:

我有一个通过数据库优先导入生成的主/子关系模型。当我尝试在同一页面上输出子数据时,我会为每个子行而不是数据显示“System.Data.Entity.DynamicProxies ...”字符串。我认为 .NET MVC 足够聪明,可以识别子集合并自动输出行数据(我最终会添加显示/编辑格式化模板)。我能够通过主视图中的循环遍历数据,因此数据在集合中,但尝试 DisplayFor 子类正在显示代理名称或其他内容。有谁知道怎么回事?谢谢。

生成的模型(为简洁起见,省略了额外的字段)如下:

namespace Test.Models
{

    public partial class HCCB_CR
    {
        public HCCB_CR()
        {
            this.HCCB_CR_CONTACTS = new HashSet<HCCB_CR_CONTACT>();
        }

        public string CCID { get; set; }
        public virtual ICollection<HCCB_CR_CONTACT> HCCB_CR_CONTACTS { get; set; }
    }
}

namespace Test.Models
{
    public partial class HCCB_CR_CONTACT
    {
        public decimal ID { get; set; }     //key
        public string CCID { get; set; }    // foreign key to hccb_cr

        public virtual HCCB_CR HCCB_CR { get; set; }
    }
}

为详细信息生成的脚手架(略):

@model Test.Models.HCCB_CR
@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<fieldset>
    <legend>HCCB_CR</legend>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.CCID)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.CCID)
    </div>

    <div class="display-field">
        @Html.DisplayFor(model => model.HCCB_CR_CONTACTS)
    </div>
</fieldset>

输出:

CCID 
HCCB-CR100290 
System.Data.Entity.DynamicProxies.HCCB_CR_585E5CAF66461CDD0DF7F83DACDFCA848E78470297E638B38AB0FFDC8CBD83DASystem.Data.Entity.DynamicProxies.HCCB_CR_585E5CAF66461CDD0DF7F83DACDFCA848E78470297E638B38AB0FFDC8CBD83DASystem.Data.Entity.DynamicProxies.HCCB_CR_585E5CAF66461CDD0DF7F83DACDFCA848E78470297E638B38AB0FFDC8CBD83DASystem.Data.Entity.DynamicProxies.HCCB_CR_585E5CAF66461CDD0DF7F83DACDFCA848E78470297E638B38AB0FFDC8CBD83DASystem.Data.Entity.DynamicProxies.HCCB_CR_585E5CAF66461CDD0DF7F83DACDFCA848E78470297E638B38AB0FFDC8CBD83DASystem.Data.Entity.DynamicProxies.HCCB_CR_585E5CAF66461CDD0DF7F83DACDFCA848E78470297E638B38AB0FFDC8CBD83DA

什么是 System.Data.Entity.DynamicProxies.HCCB_CR_...,为什么会这样?

更新:希望这可能会有所帮助。进入 DisplayFor 时调试输出:

The thread '<No Name>' (0x3e70) has exited with code 0 (0x0).
Step into: Stepping over non-user     code 'System.Web.Mvc.WebViewPage<Test2.Models.HCCBJEFF_CR>.Html.get'
The thread '<No Name>' (0x3e48) has exited with code 0 (0x0).
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR.HCCBJEFF_CR_CONTACTS.get'
Step into: Stepping over non-user code 'System.Data.Entity.DynamicProxies.HCCBJEFF_CR_9D376C551350D68ED0D45F44495C7047639AE18E195454A7CE1DAB8EB66DDAF2.HCCBJEFF_CR_CONTACTS.get'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR.CCID.get'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.RelatedEnd.CreateSourceQuery<Test2.Models.HCCBJEFF_CR_CONTACT>'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.RelatedEnd.ValidateLoad<Test2.Models.HCCBJEFF_CR_CONTACT>'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.EntityCollection<Test2.Models.HCCBJEFF_CR_CONTACT>.Load'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.HCCBJEFF_CR_CONTACT'
Step into: Stepping over non-user code 'System.Data.Entity.DynamicProxies.HCCBJEFF_CR_CONTACT_0D5EDED0A9ECB95525658A667586E43649A2EDCBFD933981026D54A30B929661.HCCBJEFF_CR_CONTACT_0D5EDED0A9ECB95525658A667586E43649A2EDCBFD933981026D54A30B929661'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.CONTACTID.set'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.CNAME.set'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.CCID.set'
Step into: Stepping over non-user code 'System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly<Test2.Models.HCCBJEFF_CR_CONTACT>'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.CONTACTID.get'
Step into: Stepping over non-user code 'System.Data.Objects.ObjectStateManager.CheckKeyMatchesEntity'
Step into: Stepping over non-user code 'System.Data.Objects.ObjectStateManager.AddEntry'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.CNAME.get'
Step into: Stepping over non-user code 'System.Data.Objects.EntityEntry.TakeSnapshot'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.CCID.get'
Step into: Stepping over non-user code 'System.Data.Objects.EntityEntry.TakeSnapshot'
Step into: Stepping over non-user code 'System.Data.Objects.ObjectStateManager.AddEntry'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.HCCBJEFF_CR.get'
Step into: Stepping over non-user code 'System.Data.Entity.DynamicProxies.HCCBJEFF_CR_CONTACT_0D5EDED0A9ECB95525658A667586E43649A2EDCBFD933981026D54A30B929661.GetBasePropertyValue'
Step into: Stepping over non-user code 'System.Data.Objects.Internal.EntityProxyFactory.TryGetBasePropertyValue'
Step into: Stepping over non-user code 'System.Data.Objects.Internal.EntityProxyFactory.CreateBaseGetter.AnonymousMethod__4'
Step into: Stepping over non-user code 'System.Data.Objects.Internal.PocoPropertyAccessorStrategy.GetNavigationPropertyValue'
Step into: Stepping over non-user code 'System.Data.Objects.EntityEntry.WillNotRefSteal'
Step into: Stepping over non-user code 'System.Data.Objects.EntityEntry.FixupEntityReferenceToPrincipal'
Step into: Stepping over non-user code 'Test2.Models.HCCBJEFF_CR_CONTACT.HCCBJEFF_CR.set'
Step into: Stepping over non-user code 'System.Data.Entity.DynamicProxies.HCCBJEFF_CR_CONTACT_0D5EDED0A9ECB95525658A667586E43649A2EDCBFD933981026D54A30B929661.HCCBJEFF_CR.set'
Step into: Stepping over non-user code 'System.Data.Objects.Internal.PocoPropertyAccessorStrategy.SetNavigationPropertyValue'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.RelatedEnd.Add'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.EntityReference<Test2.Models.HCCBJEFF_CR>.ReferenceValue.set'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.EntityReference.SetEntityKey'
Step into: Stepping over non-user code 'System.Data.Objects.EntityEntry.FixupEntityReferenceToPrincipal'
Step into: Stepping over non-user code 'System.Data.Objects.EntityEntry.FixupReferencesByForeignKeys'
Step into: Stepping over non-user code 'System.Data.Objects.ObjectStateManager.FixupReferencesByForeignKeys'
Step into: Stepping over non-user code 'System.Data.Objects.ObjectStateManager.AddEntry'
Step into: Stepping over non-user code 'System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly<Test2.Models.HCCBJEFF_CR_CONTACT>'
Step into: Stepping over non-user code 'System.Data.Common.Internal.Materialization.Coordinator<Test2.Models.HCCBJEFF_CR_CONTACT>.ReadNextElement'
Step into: Stepping over non-user code 'System.Data.Common.Internal.Materialization.Shaper<Test2.Models.HCCBJEFF_CR_CONTACT>.SimpleEnumerator.MoveNext'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.RelatedEnd.Merge<Test2.Models.HCCBJEFF_CR_CONTACT>'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.EntityCollection<Test2.Models.HCCBJEFF_CR_CONTACT>.Load'
Step into: Stepping over non-user code 'System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad'
Step into: Stepping over non-user code 'System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty<System.__Canon>'
Step into: Stepping over non-user code 'System.Data.Entity.DynamicProxies.HCCBJEFF_CR_9D376C551350D68ED0D45F44495C7047639AE18E195454A7CE1DAB8EB66DDAF2.HCCBJEFF_CR_CONTACTS.get'
Step into: Stepping over non-user code 'System.Web.Mvc.ModelMetadata.FromLambdaExpression<Test2.Models.HCCBJEFF_CR,System.Collections.Generic.ICollection<Test2.Models.HCCBJEFF_CR_CONTACT>>.AnonymousMethod__2'
Step into: Stepping over non-user code 'System.Web.Mvc.ModelMetadata.Model.get'
Step into: Stepping over non-user code 'System.Web.Mvc.Html.TemplateHelpers.TemplateHelper'
Step into: Stepping over non-user code 'System.Web.Mvc.Html.TemplateHelpers.TemplateFor<Test2.Models.HCCBJEFF_CR,System.Collections.Generic.ICollection<Test2.Models.HCCBJEFF_CR_CONTACT>>'

HCCB_CR_CONTACT 模板:

    @model Test.Models.HCCB_CR_CONTACT

    <fieldset>
        <legend>HCCB_CR_CONTACT</legend>

        <div class="display-label">
             @Html.DisplayNameFor(model => model.ID)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.ID)
        </div>
        <div class="display-label">
             @Html.DisplayNameFor(model => model.CCID)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.CCID)
        </div>
    </fieldset>
    <p>
        @Html.ActionLink("Edit", "Edit", new { id=Model.ID }) |
        @Html.ActionLink("Back to List", "Index")
    </p>

【问题讨论】:

  • 这些是真实的类名吗?
  • HCCB_CR 和 HCCB_CR_CONTACT 是从现有 Oracle 表生成的真实类名。输出似乎正在显示生成的代理。

标签: c# .net razor asp.net-mvc-4 displayfor


【解决方案1】:

由于它不知道如何渲染散列集中的项目,DisplayFor 正在调用集合中每个项目的 ToString 方法。

你可能想看看creating MVC display templates and edit templates

【讨论】:

  • 我尝试了一个 MVC 显示模板并得到了相同的输出。似乎它被忽略了,所以我什至明确地将模板名称指定为 DisplayFor 中的第二个参数,并且仍然得到该代理输出。不过这很奇怪,因为在调试 DisplayFor 时,调试器将 model.HCCB_CR_CONTACTS 报告为正确的类型,并且我可以在向下钻取时看到里面的子数据。
  • 您是否为哈希集或个人联系人创建了模板?联系人是它不知道如何呈现的东西。这里有一些可以尝试的方法,在您上面的视图中,为每个循环创建一个遍历 Model.Hccb_cr_contacts 的循环,渲染各个联系人对象。如果可行,您可以将其移至模板中
  • 我为单个联系人创建了一个名为 HCCB_CR_CONTACT 的模板。根据我的阅读,如果我使用单个模板(与带有循环的 IEnumerable 相反),DisplayFor 应该为我处理循环。我还尝试了一个名为 HCCB_CR_CONTACTS 的局部视图,它带有 IEnumerable 和一个循环,并且能够很好地显示数据。所以我遇到的主要问题是,为什么它不直接使用(或不使用)模板进行渲染?在 DisplayFor 上的调试断点中,它知道它正在传递联系人类型并让我深入研究子数据,但是当它呈现时它会吐出代理的东西。
  • 仅供参考 - 在上面的原始帖子中添加了 DisplayFor 的调试输出。
  • 您需要开始更多的蛮力,然后再进行模板化。现在,忘记模板,忘记局部视图,只需手动渲染联系人。 @foreach(hccb_cr_contact c in Model.hccb_cr_contacts) { @c.firstname } - 我希望你明白我的意思
【解决方案2】:

我遇到了同样的问题,但不知何故,我的 .cshtml 文件(在 DisplayTemplates 中)没有发布(不再)。

确保将 Build Action 设置为 Content

我花了几个小时才弄清楚,所以我想把它作为一个解决方案。

【讨论】:

    【解决方案3】:

    我自己也遇到了这个问题。确保您具备以下条件:

    1. 在您的共享视图文件夹中,您需要一个文件夹标题 DisplayTemplates。
    2. 在您的 DisplayTemplates 文件夹中,您需要部分视图,该视图的名称与您的模型完全相同(因此在您的情况下,该文件将是 /Shared/DisplayTemplates/HCCB_CR_CONTACT.cshtml,文件名前没有下划线)。

    因此,作为一个使用您的测试内容的示例,您将执行与...非常相似的操作

    /Views/Shared/DisplayTemplates/HCCB_CR_CONTACT.cshtml

    @model Test.Models.HCCB_CR_CONTACT
    
    <fieldset>
        <legend>HCCB_CR_CONTACT</legend>
    
        <div class="display-label">
             @Html.DisplayNameFor(model => model.ID)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.ID)
        </div>
        <div class="display-label">
             @Html.DisplayNameFor(model => model.CCID)
        </div>
        <div class="display-field">
            @Html.DisplayFor(model => model.CCID)
        </div>
    </fieldset>
    <p>
        @Html.ActionLink("Edit", "Edit", new { id=Model.ID }) |
        @Html.ActionLink("Back to List", "Index")
    </p>
    

    /Views/HCCB_CR_BlahBlah.cshtml

    @model HCCB_CR
    
    <div>
       <span>@Model.CCID</span>
       @Html.DisplayFor(model => model.HCCB_CR_CONTACTS)       
    </div>  
    

    注意:此方法使用带有剃须刀视图的 ASP.Net MVC 5 和 .Net 4.5.1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多