如何在C#文本字符串中包含@ Html.Actionlink?

时间:2013-11-01 02:03:41

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

虽然@ 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内容并不是最好的做法,但是在这种情况下是否可以获得正确的<a>链接,而不是字符串本身?

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

必须采用“正确”的方式,这很简单但可维护。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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