【问题标题】:What is the @Html.DisplayFor syntax for?@Html.DisplayFor 语法有什么用?
【发布时间】:2011-09-15 23:25:36
【问题描述】:

我知道在 Razor 中,@Html 做了很多简洁的事情,比如为链接、输入等生成 HTML。

但我没有得到 DisplayFor 功能...

我为什么要写:

@Html.DisplayFor(model => model.Title)

当我可以写的时候:

@Model.Title

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    Html.DisplayFor() 将呈现与属性类型匹配的 DisplayTemplate。

    如果找不到,我想它会调用.ToString()


    如果您不了解显示模板,它们是部分视图,可以放在与控制器关联的视图文件夹内的 DisplayTemplates 文件夹中。


    例子:

    如果您使用以下代码在您的视图文件夹的DisplayTemplates 文件夹内创建一个名为String.cshtml 的视图(例如HomeShared):

    @model string
    
    @if (string.IsNullOrEmpty(Model)) {
       <strong>Null string</strong>
    }
    else {
       @Model
    }
    

    然后@Html.DisplayFor(model =&gt; model.Title)(假设Title是一个字符串)将使用模板并在字符串为空或空时显示&lt;strong&gt;Null string&lt;/strong&gt;

    【讨论】:

    • 在大多数情况下,将 DisplayFor 用于原始类型对我来说似乎毫无意义。例如,即使时间部分无用,DateTime 也会显示日期/时间。如果您可以在 Model 的属性属性中为 DateTime 类型指定格式字符串“{0:d}”,那么 DisplayFor 可能会更有用。
    • @enorl76 你可以。见Daveo's answer
    • 您可以为 DateTime 数据类型的 EditorFor 模板添加一个 jQuery 日期选择器,以便始终在表单中显示日期选择器。
    • 在我看来,一般来说使用它是过度设计的,但是当你想为某些模型属性格式化输出时,你应该使用它。有帮助的问题和答案,谢谢。全方位 +1。
    • 如果您有两个同名的模型会怎样?
    【解决方案2】:

    我认为主要的好处是当您定义自己的显示模板或使用数据注释时。

    例如,如果您的标题是日期,您可以定义

    [DisplayFormat(DataFormatString = "{0:d}")]
    

    然后在每个页面上都会以一致的方式显示该值。否则,您可能必须在多个页面上自定义显示。所以它对纯字符串没有多大帮助,但它对货币、日期、电子邮件、网址等有帮助。

    例如,电子邮件地址不是纯字符串,而是可以显示为链接:

    <a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
    

    【讨论】:

      【解决方案3】:

      DisplayFor 也可用于模板。您可以为您的模型编写一个模板,然后执行以下操作:

      @Html.DisplayFor(m => m)
      

      类似于@Html.EditorFor(m =&gt; m)。它对 DRY 主体很有用,因此您不必为同一个模型一遍又一遍地编写相同的显示逻辑。

      看看这个关于 MVC2 模板的博客。对MVC3还是很适用的:

      http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/


      如果你的模型有一个数据注解,它也很有用。例如,如果模型上的属性用EmailAddress 数据注释修饰,DisplayFor 会将其呈现为mailto: 链接。

      【讨论】:

      • @Html.DisplayFor(m =&gt; m) 也可以简化为 @Html.DisplayForModel()
      • 什么是lamda表达式(m=>m)?第一个 m 代表什么?
      • 第一个m是参数名
      • @magic-c0d3r 第一个 m 是页面的模型对象。这就是 labmda 表达式中使用的内容
      【解决方案4】:

      一般来说,如果它只用于一个属性,生成的 HTML 似乎是相同的。

      例如这段代码

      <td>@Html.DisplayFor(modelItem=>item.Genre.Name)</td>         
      <td>@item.Genre.Name, This is direct from Item</td>
      

      生成此 HTML

      <td>myClassNameProperty</td>
      <td>myClassNameProperty, This is direct from Item</td>
      

      同时,如果我想在这种情况下为我的类“流派”在一个语句中显示所有属性, 我可以使用@Html.DisplayFor() 来节省我的打字时间,至少

      我可以编写 @Html.DisplayFor(modelItem=>item.Genre) 来代替为 Genre 的每个属性编写单独的语句,如下所示

      @item.Genre.Name
      @item.Genre.Id
      @item.Genre.Description
      

      等等,取决于属性的数量。

      第三方编辑

      来自html-helpers documentation

      HTML Helper 只是一个返回字符串的方法。字符串可以 代表您想要的任何类型的内容。例如,您可以使用 HTML Helpers 呈现标准的 HTML 标签,如 HTML 和 标签。您还可以使用 HTML Helpers 来呈现更复杂的内容 例如标签条或数据库数据的 HTML 表。

      为了渲染更复杂的html,使用mvc custom html templatescustom tag helpers in asp.net core

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        相关资源
        最近更新 更多