2010-10-27 52 views
3

基本上我在我的MVC输出模型中有一个自定义的“Date”类“EndDate”。 仅供参考:“Date”类构建的是DateTime,但隐藏了时间功能。我为这个Date类型创建了一个显示模板,它很好地格式化了日期,但是在一次实例中(如下所示),如果对象为null(在本例中为EndDate),我希望文本“No End Date Specified”输出代替。是否可以在Html.DisplayFor调用中放置条件语句?

<%:Html.DisplayFor(m => m.EndDate)%> 

为Date对象的所有实例,这就是常见的,我不能改变显示模板,我真的不希望改变模型本身无论是。基本上我想要的东西是这样的:

<%:Html.DisplayFor((m => (m.EndDate == null) ? "No End Date Specified" : m.EndDate)%> 

上述可能以任何形式?如果不是,那么实现此功能的更好方法是什么? 我猜即使有办法做到这一点,如果这不是一个好主意,请让我知道为什么不这样做和更好的方式做到这一点

回答

1

尝试使用UIHint

[UIHint("CustomDateNull")] 
public CustomDate EndDate { get;set; } 

然后创建一个CustomDateNull.ascx显示模板。在返回Type之前,助手会查找UIHint。

如果根本无法编辑模型,则必须使用RenderPartial并将日期作为部分视图的模型传递。

+1

谢谢,我已经有了一个玩,并得到它的工作。我也看到“DisplayFor”也可以使用显示模板名称,所以我最终得到了以下内容,它不需要在模型中使用UIHint <%:Html.DisplayFor(m => m.EndDate ,“CustomDateNull”)%> – 2010-10-27 14:44:06

+0

@Paul Hadfield太棒了!我没有看到DisplayFor超载,但这似乎是最好的选择。 – Jab 2010-10-27 15:04:47

+1

当我遇到零赞成的接受答案时,它激起我的想法。 – jfar 2010-10-28 02:25:58

0

你知道你可以使用更具体的自定义模板文件夹结构中的控制器名称?

您可能已经创建了:/Shared/DisplayTemplates/CustomDate.ascx 但对于特定的控制器,你可以使用:/MySpecific/DisplayTemplates/CustomDate.ascx

现在你不需要做任何形式的动态DisplayFor调用。您将遇到的问题是DisplayFor确实想知道您的模型表达式来自哪种对象类型的属性,以便它可以查找元数据。有了像我很确定你打破了查找成员访问的功能,然后从中查找元数据的lambda。

+0

谢谢,我知道显示模板的嵌套本质。在这种情况下,它不会帮助,因为我在同一个模型中有一个“StartDate”(当前也使用相同的DisplayFor显示)。 – 2010-10-27 12:54:32

相关问题