[英]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.