我可以回用剃刀@helper语法的字符串?(Can I return a string using

2019-09-17 00:36发布

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

@using Molecular.AdidasCoach.Library.GlobalConstants

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

但是,我有我想要的结果用作在链接文本的情况下, @Html.ActionLink(...) 我不能结果转换为字符串。

有没有办法从剃刀助手返回纯字符串,这样我既可以在HTML和内使用它们@Html帮手?

Answer 1:

剃刀助手返回HelperResult对象。

你可以通过调用获取原始的HTML ToString()

欲了解更多信息,请参见我的博客文章 。



Answer 2:

在你的情况,我认为这也将工作:

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


Answer 3:

我不认为有办法让@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剃刀:助手导致html.actionlink表明你的助手可以通过返回一个字符串@Html.Raw(GlobalConfigs.GetTranslatedValue(key));



Answer 4:

下面的语句已验证对MVC版本5.2.4.0 。 我主要是针对与部分: 有什么办法从剃刀助手返回纯字符串,这样我既可以在HTML和@Html助手里使用它们?

我做了如何建在MVC佣工工作的一些研究,他们实际上的性质System.Web.Mvc.WebViewPage类,所以他们什么都没有做@helper功能。

任何@helper编码字符串作为HTML和工作方式,如果代码被复制粘贴到剃刀代码块中的View,又名@{ code } 。 在另一侧, @functions应该剃刀块内使用。

那么,如果一个@helper作品仿佛代码复制粘贴,为什么不使用@Html.Raw("<p>cool</p>") 因为HTML属性里面助手空。 为什么? 我不知道。

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

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

@Html.Raw(GetString())

如果你不明白为什么@Html.Raw是必要的,请阅读@SLaks这个美好的文章剃刀自动HTML编码 。

怎么样用内置的属性的方法吗? 是的,它是能够与其他工作就像公共方法创建静态类。 唯一的问题是,你必须包括在视图的命名空间,与@using关键字。 可以在改进? 是的,在加上命名空间Web.config的浏览文件夹中。 例:

助手/ 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#多行代码的帮手,我建议使用一个静态类帮手。



文章来源: Can I return a string using the @helper syntax in Razor?