【问题标题】:Can I return a string using the @helper syntax in Razor?我可以在 Razor 中使用 @helper 语法返回一个字符串吗?
【发布时间】:2012-05-14 03:04:51
【问题描述】:

我在app_code 中有一个 RazorHelpers.cshtml 文件,它看起来像:

@using Molecular.AdidasCoach.Library.GlobalConstants

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

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

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

【问题讨论】:

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


    【解决方案1】:

    Razor 助手返回 HelperResult 对象。

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

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

    【讨论】:

    • 天啊!无法想象为什么我没有想到这一点。谢谢!将在分配的窗口后接受。
    • 请在您的答案中添加示例
    • 在 MVC 5.2.4.0 中,HelperResult.ToString 似乎返回了编码的 HTML。以下帮助器 @helper Test() { @("Something <p>cool</p>") }@{ string str1 = MyHelpers.Test().ToString(); str2 = MyHelpers.Test().ToHtmlString(); }@Html.Raw(MyHelpers.Test()) 一起使用返回 Something<b>cool</b>
    • @MatrixRonny:你确定你打印的时候没有编码吗?
    • @SLaks:是的,我什至用调试器检查了str1str2。我注意到HtmlString 覆盖了ToString 方法。也许这就是它过去的工作方式。
    【解决方案2】:

    我认为没有办法让@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));返回一个字符串

    【讨论】:

    • @Html.Raw(GlobalConfigs.GetTranslatedValue(key))@GlobalConfigs.GetTranslatedValue(key) 产生相同的结果。
    【解决方案3】:

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

    @(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)
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      @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 和一个附加的 &lt;b&gt; 元素。如果您需要访问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# 代码,我建议使用静态类帮助程序。

      【讨论】:

        猜你喜欢
        • 2020-05-07
        • 1970-01-01
        • 2014-07-14
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        相关资源
        最近更新 更多