【问题标题】:ASP.NET Display Templates - No outputASP.NET 显示模板 - 无输出
【发布时间】:2014-04-24 19:44:39
【问题描述】:

我有这个模型:

public class DefinitionListModel : List<DefinitionListItemModel>
{
}

然后我在 DisplayTemplates 中为它设置了这个显示模板(部分视图):

@model Company.Product.Models.DefinitionListModel

<dl>
@foreach (var definition in Model)
{
    Html.DisplayFor(m => definition);
}
</dl>

调用这个默认显示模板,因为每个项目都是一个DefinitionListItemModel

@model Company.Product.Models.DefinitionListItemModel

@Html.DisplayFor(m => m.Term, "DefinitionTerm");
@Html.DisplayFor(m => m.Description, "DefinitionDescription");

DefinitionTerm 模板看起来像这样:

@model object

@{
    if (Model != null)
    {
        string s = Model as string;
        if (s != null)
        {
            <dt>@s</dt>
        }
        else
        {
            // Other types and models that could be used.

            // Last resort.

            <dt>@Model.ToString()</dt>
        }
    }
}

放置在最后一个模板中的断点成功命中,视图和标记似乎运行良好,但没有呈现,甚至上面第一个模板中的 DL 标记也不呈现。

为什么会遇到断点但不渲染任何 HTML?

【问题讨论】:

    标签: asp.net-mvc razor asp.net-mvc-5


    【解决方案1】:

    这一切都与分号有关。看来我不能像使用分号终止符的普通 C# 方法一样调用 Html.DisplayFor

    例如,这里是修改后的DefinitionListModel 模板:

    @model AcmeCo.Hudson.Models.DefinitionListModel
    
    @if (Model != null)
    {
        <dl>
            @foreach (var definition in Model)
            {
                @Html.DisplayFor(m => definition)
            }
        </dl>
    }
    

    注意 @ 在已经是 C# 的代码块中的奇怪使用。我认为在 C# 块内有一种正确的方法来执行 DisplayFor,但我不知道它是什么。

    【讨论】:

    • 嗨,这也适用于编辑模型吗?还是我需要考虑数据类型?
    【解决方案2】:

    不是因为分号,而是因为缺少@。这就是Razor 的工作原理。大括号之间的内容不应该是C#Razor 解析器试图找出什么是代码和什么是内容。要开始一段代码,您必须设置@ 字符。 Razor 解析器将大括号之间的所有内容识别为内容。

    查看Scott's blog 了解一些非常好的示例。

    【讨论】:

    • 我认为这不对,但我会等待一些选票进来。
    • 为什么不呢?你看过斯科特的博客吗?你有什么顾虑?
    • 好吧,仅仅是因为我一直使用在 Razor 视图中的 if 块的大括号中立即包含更多 C# 的代码。
    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2011-12-21
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多