我正在使用DataAnnotations编写MVC2应用程序。我有以下模型:
public class FooModel
{
[ScaffoldColumn("false")]
public long FooId { get; set; }
[UIHint("BarTemplate")]
public DateTime? Bar { get; set;}
}
我想为Bar创建一个自定义显示模板。我创建了以下模板:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime?>" %>
<div class="display-label">
<span><%: Html.LabelForModel() %></span>
</div>
<div class="display-field">
<span><%: Html.DisplayForModel()%></span>
<%: Html.ActionLink("Some link", "Action", new { id = ??FooId?? }) %>
</div>
现在,我的问题是Bar模板中的我想从模型中访问另一个属性。我不想为FooModel创建单独的模板,因为相比之下,我将必须对所有其他FooModel属性进行硬编码。
在与调试器进行简短调查之后,我可以看到:
this.ViewData.ModelMetadata.ContainerType
是FooModel
(如预期的那样)this.ViewData.TemplateInfo
有一个非公共(public)属性(property)
VisitedObjects
(类型System.Collections.Generic.HashSet<object>
)其中包含两个元素:
FooModel
和DateTime?
。 我如何获得我的FooModel?我不想使用反射来破解我的方法。
更新:
我接受了mootinator的回答,因为它对我来说是允许类型安全的最佳解决方案。我也赞成Tx3的答案,因为mootinator的答案基于此。尽管如此,我认为在这种情况下应该有来自MVC的更好的支持,我认为这在现实世界中很普遍,但示例应用程序中却没有。
最佳答案
抱歉,如果这个建议看起来很愚蠢,我还没有尝试过,但是您不能通过定义一个通用类来引用您想要的任何类型的父类而不必创建一堆新类而执行Tx3的建议吗?
public class FooModel
{
[ScaffoldColumn("false")]
public long FooId { get; set; }
[UIHint("BarTemplate")]
public ParentedDateTime<FooModel> Bar { get; set;}
public FooModel()
{
Bar = new ParentedDateTime<FooModel>(this);
}
}
public class ParentedDateTime<T>
{
public T Parent {get; set;}
public DateTime? Babar {get; set; }
public ParentedDateTime(T parent)
{
Parent = parent;
}
}
您可以扩展它以使用
<Parent, Child>
类型的泛型来封装任何旧类型。这也将为您带来好处,即您的强类型模板将用于
Inherits="System.Web.Mvc.ViewUserControl<ParentedDateTime<FooType>>
,因此您不必明确命名要在任何地方使用的模板。这是事物打算如何工作的更多信息。关于asp.net-mvc-3 - MVC2-如何在Temp内获取父模型(容器),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4009129/