【问题标题】:@Html.LabelFor with an <a> tag inside it@Html.LabelFor 里面有一个 <a> 标签
【发布时间】:2015-08-14 02:10:09
【问题描述】:

这应该是一个相当简单的问题,我要做的就是在剃刀视图中使用@Html.LabelFor。我的一个标签不同,它有一个 标签。问题是当我使用LabelFor时,它将html编码为<。我已经尝试了很多不同的方法来实现这一点,但它们都没有奏效。这是代码。

@Html.LabelFor(model => model.Question, new { @for = "Question" })

应该输出什么:

<label for="question"><a href=\"mailto:support@testdomain.com">support@testdomain.com</a></label>

输出了什么:

&lt;label for="question"&gt;&lt;a href=\"mailto:support@testdomain.com"&gt;support@testdomain.com&lt;/a&gt;</label>

(我的

我怎样才能让它输出它应该输出的东西?

注意,model.Question 设置为 support@testdomain.com

【问题讨论】:

  • 我尝试过使用不同的 html.labelfor 重载,包括自己传入一个字符串。这也得到了编码。我什至尝试过 html.raw。它也回来编码。
  • 你是如何使用 Html.Raw 的?提示:它将被编码到数据库中。
  • 似乎没有意义。 &lt;label&gt; 元素是一个可访问性控件 - 当您单击它时,焦点将设置为关联的控件。您想打开电子邮件编辑器,所以它不应该是一个标签。
  • 我和大多数人一样在问为什么&lt;a&gt; 标记在&lt;label&gt; 中。我认为,上述使用是可以接受的based on MDN。在这种情况下,&lt;a&gt; 标签类似于phrasing content。另见SO item。虽然我不希望在我的&lt;label&gt; 中有链接,特别是如果我使用带有输入字段的for 属性。

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


【解决方案1】:

为什么您希望您的标签包含完整的 HTML?我认为这将是存储电子邮件地址的更好方法,在您看来,您可以这样做:

 <a href="mailto:@Model.Email">@Model.Email</a>

为了得到预期的结果。

编辑

IMO 通过在标签中编码内容只会使您的工作更加复杂,因为标签并不意味着保存格式化的 HTML 或功能或类似的东西,而只是要显示的标题。用法示例:

型号代码:

[Display(Name = "Email address")]
public string EmailAddress { get; set; }

在视图中:

@Html.LabelFor(model => model.EmailAddress): 
@Html.DisplayFor(model => model.EmailAddress)

<!-- OR (no label element just the label text)-->

@Html.DisplayNameFor(model => model.EmailAddress): 
@Html.DisplayFor(model => model.EmailAddress)

然后可以任意组合:

[Display(Name = "Send Email")]
public string EmailAddress { get; set; }

@Html.LabelFor(model => model.EmailAddress): <a href="mailto:@Model.EmailAddress">@Model.Email</a>

在运行时将是:

发送电子邮件: abc@server.com

【讨论】:

  • --忽略这条评论--
  • 这是正确的做法。您正在通过使用包含 html 字符串甚至特征的标签为自己制造问题。标签应该用于显示属性的名称(或非常简短的描述),请参阅更新的答案...
【解决方案2】:

您正在与 Razor 系统作斗争,因为它默认编码。这就是使用 Razor 的美妙之处。包括Label在内的许多标签类最终都会通过调用TagBuilderExtensions.ToMvcHtmlString来呈现自己

internal static class TagBuilderExtensions
  {
    internal static MvcHtmlString ToMvcHtmlString(this TagBuilder tagBuilder, TagRenderMode renderMode)
    {
      return new MvcHtmlString(tagBuilder.ToString(renderMode));
    }
  }

MvcHtmlString 表示不应再次编码的 HTML 编码字符串。所以你不能通过LabelFor 做你想做的事情。 Razor 实际上是专门确保你不能。

但既然你的 malto: 不是一个真正的标签,你可以:

@Html.Raw(Server.HtmlDecode(Model.MyField)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2014-07-11
    相关资源
    最近更新 更多