我可以在Razor中使用@helper语法返回一个字符串吗?

时间:2012-05-04 14:43:09

标签: string asp.net-mvc-3 razor type-conversion razor-declarative-helpers

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

@using Molecular.AdidasCoach.Library.GlobalConstants

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

但是,我有一个案例,我希望将结果用作@Html.ActionLink(...)中的链接文本。我无法将结果转换为字符串。

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

4 个答案:

答案 0 :(得分:30)

Razor助手返回HelperResult个对象。

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

有关详细信息,请参阅my blog post

答案 1 :(得分: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)
    }
}

答案 2 :(得分:15)

我认为没有办法让@helper返回除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));

返回字符串

答案 3 :(得分:0)

以下语句已针对MVC版本5.2.4.0进行了验证。我主要针对的部分是:是否可以通过任何方式从Razor帮助程序返回纯字符串,以便可以在HTML和@Html帮助程序中使用它们?

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

任何@helper都将字符串编码为HTML,并且就像将代码复制粘贴到Razor代码块(也称为@{ code })中的View上一样工作。另一方面,@functions应该在Razor块内使用。

好吧,如果@helper就像复制代码一样工作,为什么不使用@Html.Raw("<p>cool</p>")?因为助手中的Html属性为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>");
        }
    }
}

Views / 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#代码,则建议使用静态类帮助程序。