我有一个RazorHelpers.cshtml文件app_code
它看起来像:
@using Molecular.AdidasCoach.Library.GlobalConstants
@helper Translate(string key)
{
@GlobalConfigs.GetTranslatedValue(key)
}
但是,我有我想要的结果用作在链接文本的情况下, @Html.ActionLink(...)
我不能结果转换为字符串。
有没有办法从剃刀助手返回纯字符串,这样我既可以在HTML和内使用它们@Html
帮手?
剃刀助手返回HelperResult
对象。
你可以通过调用获取原始的HTML ToString()
欲了解更多信息,请参见我的博客文章 。
在你的情况,我认为这也将工作:
@(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)
}
}
我不认为有办法让@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));
下面的语句已验证对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#多行代码的帮手,我建议使用一个静态类帮手。