31

我有一个 RazorHelpers.cshtml 文件,app_code其中如下所示:

@using Molecular.AdidasCoach.Library.GlobalConstants

@helper Translate(string key)
{
    @GlobalConfigs.GetTranslatedValue(key)
}

但是,我有一个案例,我想将结果用作@Html.ActionLink(...). 我无法将结果转换为字符串。

有没有办法从 Razor 助手返回纯字符串,以便我可以在 HTML 和@Html助手中使用它们?

4

4 回答 4

33

Razor 助手返回HelperResult对象。

您可以通过调用来获取原始 HTML ToString()

有关详细信息,请参阅我的博客文章

于 2012-05-04T14:44:10.173 回答
18

我认为没有办法让@helperreturn 以外的其他类型HelperResult。但是您可以使用返回类型为 的函数string,例如

@functions {
    public static string tr(string key) {
        return GlobalConfigs.GetTranslatedValue(key);
    }
}

然后

@Html.ActionLink(tr("KEY"), "action", "controller")

另请参阅http://www.mikesdotnetting.com/article/173/the-difference-between-helpers-and-functions-in-webmatrix

编辑:MVC Razor: Helper result in html.actionlink建议您的助手可以通过使用返回一个字符串@Html.Raw(GlobalConfigs.GetTranslatedValue(key));

于 2016-05-26T20:52:46.830 回答
16

在您的情况下,我认为这也可以:

@(GlobalConfigs.GetTranslatedValue(key))

附加样本:

@helper GetTooltipContent()
{       
    if(Model.SubCategoryType == SUBCATTYPE.NUMBER_RANGE)
    {
        @(string.Format("{0} to {1}", Model.SubCategoryMinimum, Model.SubCategoryMaximum))
    }
    else if(Model.SubCategoryType == SUBCATTYPE.NUMBER_MAXIMUM)
    {
        @("<= " + Model.SubCategoryMaximum)
    }
    else if(Model.SubCategoryType == SUBCATTYPE.NUMBER_MINIMUM)
    {
        @(">= " + Model.SubCategoryMinimum)
    }
}
于 2013-08-31T21:16:52.237 回答
3

以下语句已针对 MVC 版本进行了验证5.2.4.0。我主要针对以下部分:有什么方法可以从 Razor 助手返回纯字符串,以便我可以在 HTML 和 @Html 助手中使用它们?

我对内置的 MVC 助手如何工作进行了一些研究,它们实际上是类的属性,因此它们与功能System.Web.Mvc.WebViewPage无关。@helper

Any@helper将字符串编码为 HTML,并且就像将代码复制粘贴到 Razor 代码块(又名@{ code }. 另一方面,@functions应该在 Razor 块内使用。

好吧,如果 a@helper就像复制粘贴代码一样工作,为什么不使用@Html.Raw("<p>cool</p>")?因为 Html 属性在 helpers 中为 null。为什么?我不知道。

好的,但是我们可以使用一个函数来返回一个字符串,然后应用@Html.Raw到结果上。那样有用吗?是的,它确实。以下示例<p>在 DOM 中创建一个元素:

@functions
{
    static string GetString()
    {
        return "<p>awesome</p>";
    }
}

@Html.Raw(GetString())

如果你不明白为什么@Html.Raw是必要的,请阅读@SLaks 关于Razor 自动 HTML 编码的这篇精彩文章。

内置属性的方法怎么样?是的,可以使用像这样工作的公共方法创建静态类。唯一的问题是您必须在视图中包含名称空间和@using关键字。可以改进吗?是的,通过在Web.configViews 文件夹中添加命名空间。例子:

助手/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()

结果如何?文本Something和附加<b>元素将在 DOM 中找到。如果您需要访问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# 代码,我建议使用静态类帮助程序。

于 2019-03-19T20:56:25.800 回答