【问题标题】:How to include @Html.Actionlink in C# text string?如何在 C# 文本字符串中包含 @Html.Actionlink?
【发布时间】:2013-11-12 05:41:43
【问题描述】:

虽然 @Html.Actionlink() 帮助器非常方便在 .cshtml 文件中构建 <a> 元素,但是否可以在 C# 字符串中构造它们,以便随后在 HTML 输出中正确呈现它们?

例如,如果我为字符串变量分配类似于以下的值:

Book.ReadMore = "Click @Html.ActionLink(\"this link\", \"About\", \"Home\") to read more.";

然后我尝试通过我的 .cshtml 页面显示它(文字加上链接),使用类似于:

<p>@Model.ReadMore</p>

我在浏览器中得到的只是我输入的整个字符串,包括@Html...等:

Click @Html.ActionLink("this link", "About", "Home") to read more.

现在,对于正确的 SoC,我知道在 C# 代码中包含 HTML 内容并不是最佳实践,但在这种情况下是否有可能获得正确的 &lt;a&gt; 链接,而不是字符串本身?

编辑:更多信息 - 此字符串只是大约 20-30 个字符串集合中的一项(在视图中使用 for loop 显示)。这些项目中只有一小部分需要链接(在每种情况下都不同)。因为,如上所述,我同意在模型代码中使用 Razor/HTML 显然不是一个好习惯,所以我正在尝试一种简单的方法(如果可能的话),这将使我能够灵活地在右侧某处构建链接位置,同时仍然产生 MVC SoC 的可维护性。

必须有一种“正确”的方式来做到这一点,既简单又可维护。

【问题讨论】:

标签: c# asp.net-mvc-4 html-helper


【解决方案1】:

您的模型不应包含 HTML,这是一个视图问题,属于视图代码。可能您应该使用 Razor 助手。

在您的 App_Code 文件夹中(如果没有,请创建一个),添加一个文件 ReadMoreHelpers.cshtml:

@helper ReadMore() {
    <text>Click @Html.ActionLink("this link", "About", "Home") to read more.</text>
}

然后在任何视图中:

@ReadMoreHelpers.ReadMore()

这将输出你想要的。如果您坚持将该属性放在您的视图中,您可以这样做:

Book.ReadMore = "Click " + @Html.ActionLink("this link", "About", "Home").ToHtmlString() + " to read more.";

那么在你看来,确保你使用Raw:

@Html.Raw(Book.ReadMore) 

但是,我强烈建议您不要将 HTML 放入模型属性中。

【讨论】:

  • 我当然 100% 同意模型中没有 HTML。在我对原始帖子的编辑中概述了更详细的场景,我正在寻找实际上如何避免它。我想知道是否有可能(并遵循最佳实践)通过这些步骤实现干净的分离:(a)在模型中,声明各种标记的枚举,然后(b)也在模型中,将这些标记包含在字符串项中需要,最后 (c) 构建一个 Razor Helper 将枚举标记转换为那些 ActionLinks。
【解决方案2】:

我不这么认为。 Razor 视图引擎将在运行时解释 ActionLink 代码,而将其填充为 C# 字符串的一部分将在编译时解释。

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2011-10-24
    相关资源
    最近更新 更多