繁体   English   中英

如果在模板中重复使用相同的模型,则MVC DisplayFor模板似乎退出工作

[英]MVC DisplayFor templates seem to quit working if the same model is reused within the template

我有一个非常奇怪的情况。 我有一个模型,并且有两个模板都是根据此模型的类型进行强类型化的。 模板是嵌套的,换句话说,我在第一个模板中的第二个模板上使用DisplayFor。 如果我使用与第一个模板关联的模型,则在第二个模板的DisplayFor调用中,不会渲染第二个模板。 如果我使用相同模型类型的另一个实例,则一切正常。 似乎对与嵌套模板相关联的模型进行了某种周期检查。

模型:

public class MyModel
{
    public string Value { get; set; }
    public MyModel Copy
    {
        get { return (MyModel) this.MemberwiseClone(); }
    }

    public MyModel MySelf
    {
        get { return this; }
    }
}

DisplayTemplate1:

@model TestNestedTemplateSameReference.Models.MyModel

<div>Model1</div>
<div>@Model.Value</div>
<div>@Html.DisplayFor(x=>x, "ModelTemplate2")</div>

DisplayTemplate2:

@model TestNestedTemplateSameReference.Models.MyModel

<div>Model2</div>
<div>@Model.Value</div>

有趣的是,如果不打电话

@Html.DisplayFor(x=>x, "ModelTemplate2")

我用Copy属性来称呼它

<div>@Html.DisplayFor(x=>x.Copy, "ModelTemplate2")</div>

一切正常,因为MyModel类的实际实例不同。

有谁知道为什么这样做。 是否有可行的解决方法。 看来这是完全合法的用法,不应引起堆栈溢出或任何类似问题。 我可以看到如何将其用于防止没有模板名称的DisplayFor调用的循环,但是如果我指定了模板名称,则看起来应该可以正常工作。

将同一模型绑定到多个EditFor模板似乎很危险,但是DisplayFor似乎很安全。

我当然可以为嵌套级别创建一个单独的模型,但这就是在创建redundand类。

任何帮助表示赞赏。

如果您尝试执行的操作成功,则通过Copy方法创建对象后,该对象将导致堆栈溢出。 每个对象将依次创建其自身的新副本,您将很快耗尽内存或堆栈。

默认模板在显示属性之前执行此方法

bool ShouldShow(ModelMetadata metadata) {
    return metadata.ShowForEdit
        && metadata.ModelType != typeof(System.Data.EntityState)
        && !metadata.IsComplexType
        && !ViewData.TemplateInfo.Visited(metadata);
}

我的猜测是它绊倒了IsComplexType或TemplateInfo.Visited。

这里有更多信息:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

暂无
暂无

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

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