2013-11-01 27 views
0

虽然@ Html.Actionlink()助手非常方便在.cshtml文件中构建<a>元素,但是可以在C#字符串中构造它们,以便随后在HTML输出中正确渲染它们?如何在C#文本字符串中包含@Html.Actionlink?

例如,如果我给你一个字符串变量类似于以下值:

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东西并不是最好的做法,但是在这种情况下是否有可能获得适当的链接,而不是字符串本身?

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

必须有一个“正确”的方式来做到这一点,这是简单但可维护的。

+0

[如何使用MVC 3 @ Html.ActionLink里面的C#代码](http:// stackoverflow。com/questions/8331041/how-to-use-mvc-3-html-actionlink-inside -c-sharp-code) –

+0

上面的最高票数(不被接受)答案似乎有你在找什么 –

回答

0

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

1

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

在你的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放在你的模型属性中。

+0

我当然同意100%关于在模型中没有HTML。通过编辑原始文章中列出的更详细的情况,我正在寻找如何避免它。我想知道是否有可能(并遵循最佳实践)通过以下步骤实现干净的分离:(a)在模型中,声明各种令牌的枚举,然后(b)在模型中,将这些令牌包含在字符串项中(c)构建一个Razor Helper,将enum'd标记转换为ActionLink。 –

相关问题