用剃须刀进行有条件的检查

时间:2013-11-08 08:30:04

标签: asp.net-mvc-3 razor

在我的MVC视图中,我需要在模型对象中显示值。

@model List<School.Model.Student_Model>

在表格中,我显示了这些学生数据。

@foreach (var item in Model)
{
    <tr>
        ...
        <td>@Html.DisplayFor(model => item.RegisterDate)</td>
    </tr>            
}

RegisterDate可以为DateTime?

在我的表格中,如果RegisterDate为空,我希望显示消息“日期未提供”

<td>@Html.DisplayFor(model => item.RegisterDate.HasValue?item.RegisterDate.HasValue.ToString():"-")</td>

如果我在上面使用它会给我以下错误

异常详细信息:System.InvalidOperationException:模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。

如果我使用单独的If- else条件,我将能够这样做。

@if(item.RegisterDate.HasValue)
{
    <td>@Html.DisplayFor(model => item.RegisterDate)</td>
}
else
{
    <td>date is not provided</td>
}

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以为空字段定义空模板:

//EmptyTemplate.cshtml
@(Model == null ? "NULL" : Model)

并在你的DisplayFor方法中调用它:

@Html.DisplayFor(model => item.RegisterDate, "EmptyTemplate")

答案 1 :(得分:0)

必须根据模型类型的名称命名

DisplayTemplatesEditorTemplatesMyClass模型需要MyClass.cshtml作为DisplayTemplate)。虽然您无法在文件名中添加?<>,但它对可空类型的工作方式相同。在名为DisplayTemplate的{​​{1}}文件夹中创建Views\Shared\DisplayTemplates

DateTime.cshtml

它可以在您的视图中使用,如下所示:

@model DateTime?

@(Model.HasValue ? string.Format("{0:yyyy-MM-dd}", Model.Value) : "date is not provided")

您不必指定模板的名称,它将按惯例找到。