以下语句已针对 MVC 版本 5.2.4.0 进行了验证。我主要针对以下部分:有什么方法可以从 Razor 助手返回纯字符串,以便我可以在 HTML 和 @Html 助手中使用它们?
我对内置 MVC 助手如何工作进行了一些研究,它们实际上是 System.Web.Mvc.WebViewPage 类的属性,因此它们与 @helper 功能无关。
任何 @helper 都将字符串编码为 HTML,并且其工作方式就像代码复制粘贴到 Razor 代码块(即 @{ code })内的视图一样。另一方面,@functions 应该在 Razor 块中使用。
好吧,如果@helper 就像复制粘贴代码一样工作,为什么不使用@Html.Raw("<p>cool</p>")?因为 Html 属性在 helpers 中为 null。为什么?我不知道。
好的,但是我们可以使用函数返回一个字符串,然后在结果上应用@Html.Raw。那样有用吗?是的,它确实。以下示例在 DOM 中创建了一个 <p> 元素:
@functions
{
static string GetString()
{
return "<p>awesome</p>";
}
}
@Html.Raw(GetString())
如果您不明白为什么需要@Html.Raw,请阅读@SLaks 关于Razor automatic HTML encoding 的这篇精彩文章。
使用内置属性的方法怎么样?是的,可以使用像这样工作的公共方法创建静态类。唯一的问题是您必须在视图中包含命名空间,并使用 @using 关键字。可以改进吗?是的,通过在 Views 文件夹中的 Web.config 中添加命名空间。示例:
Helpers/Global.cs
namespace WebApp.Helpers
{
public static class Global
{
public static IHtmlString GetString()
{
return new HtmlString("Something <b>cool</b>");
}
}
}
视图/Web.config
<?xml version="1.0"?>
<configuration>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<!-- Add to the end of namespaces tag. -->
<add namespace="WebApp.Helpers" />
用法
@Global.GetString()
结果如何?将在 DOM 中找到文本 Something 和一个附加的 <b> 元素。如果您需要访问Request,只需在帮助方法中添加HttpContextBase 参数并在调用时传递WebViewPage.Context 属性即可。
能好起来吗?是的,一如既往。使用@helper 和@functions 可以创建相同的输出:
@helper GetString1()
{
@(new HtmlString("Something <b>awesome</b>"))
}
@functions {
public static IHtmlString GetString2()
{
return new HtmlString("Something <b>awesome</b>");
}
}
@MyHelper.GetString1()
@MyHelper.GetString2()
回答
关于 OP 的问题,我推荐 @Spikolynn 的方法来创建一个返回 string 的函数。但是,如果您需要在帮助程序中编写多行 C# 代码,我建议使用静态类帮助程序。