web-dev-qa-db-fra.com

Puis-je retourner une chaîne à l'aide de la syntaxe @Helper dans Razor?

J'ai un fichier rasorhelpers.cshtml dans app_code qui ressemble à:

@using Molecular.AdidasCoach.Library.GlobalConstants

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

Cependant, j'ai un cas où je veux utiliser le résultat en tant que texte de lien dans une fonction @Html.ActionLink(...). Je ne peux pas lancer le résultat à une chaîne.

Y a-t-il un moyen de renverser des chaînes simples des aides de Razor afin que je puisse les utiliser à la fois en HTML et dans une assistance @Html?

26
Mathletics

Les aides à Razor renvoient HelperResult objets.

Vous pouvez obtenir le code HTML brut en appelant ToString().

Pour plus d'informations, voir mon article de blog .

30
SLaks

Dans votre cas, je pense que cela fonctionnerait également:

@(GlobalConfigs.GetTranslatedValue(key))

Échantillon supplémentaire:

@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)
    }
}
16
Leniel Maccaferri

Je ne pense pas qu'il y ait un moyen de faire @helper Retourner d'autres types que HelperResult. Mais vous pouvez utiliser une fonction avec un type de retour string, par exemple.

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

alors

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

Voir aussi http://www.mikesdottitting.com/article/173/the-Ference-Between-Helpers-and-fonctions-in-webmatrix

eDIT: RAZOR MVC: Helper Résultat en HTML.ActionLink suggère votre aide peut renvoyer une chaîne à l'aide de @Html.Raw(GlobalConfigs.GetTranslatedValue(key));

15
Spikolynn

Les affirmations suivantes ont été validées contre la version MVC 5.2.4.0. Je cible principalement la partie avec: Y a-t-il un moyen de renvoyer des chaînes simples des aides à Razor afin que je puisse les utiliser à la fois dans HTML et dans une aide @html ?

J'ai fait des recherches sur la manière dont les aides MVC intégrées fonctionnent et sont en réalité des propriétés de la classe System.Web.Mvc.WebViewPage. Ils n'ont donc rien à voir avec @helper.

Tout @helper Coode Strings en tant que HTML et fonctionne comme si le code est copié collé sur la vue dans un bloc de code Razor, alias @{ code }. De l'autre côté, @functions sont censés être utilisés à l'intérieur des blocs de rasoir.

Eh bien, si un @helper fonctionne comme si le code est collé, pourquoi ne pas utiliser @Html.Raw("<p>cool</p>")? Parce que la propriété HTML est nulle à l'intérieur des aides. Pourquoi? Je n'ai aucune idée.

OK, mais nous pouvons utiliser une fonction pour renvoyer une chaîne, puis appliquer @Html.Raw sur le résultat. Est-ce que cela fonctionne? Oui. L'exemple suivant crée un élément <p> dans le DOM:

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

@Html.Raw(GetString())

Si vous ne comprenez pas pourquoi @Html.Raw est nécessaire, veuillez lire cet article fin à partir de @slaks sur codage HTML automatique de rasoir .

Qu'en est-il de l'approche avec les propriétés intégrées? Oui, il est possible de créer des classes statiques avec des méthodes publiques qui fonctionnent comme ça. Le seul problème est que vous devez inclure l'espace de noms dans la vue, avec le mot-clé @using. Cela peut-il être amélioré? Oui, en ajoutant l'espace de noms dans le Web.config dans le dossier Vues. Exemple:

Aides/Global.cs

namespace WebApp.Helpers
{
    public static class Global
    {
        public static IHtmlString GetString()
        {
            return new HtmlString("Something <b>cool</b>");
        }
    }
}

Vues/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" />

Usage

@Global.GetString()

Quel est le résultat? Le texte Something et un élément de <b> supplémentaire figureront dans le DOM. Si vous avez besoin d'accéder au Request, ajoutez simplement un paramètre HttpContextBase à la méthode de l'aide et passez la propriété WebViewPage.Context lorsque vous l'appelez.

Peut-il aller mieux? Oui, comme toujours. La même sortie peut être créée avec @helper et @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()

Réponse

En ce qui concerne la question de OP, je recommande l'approche de Spikolynn pour créer une fonction qui retourne string. Toutefois, si vous devez écrire de nombreuses lignes de code C # dans l'assistant, je suggère d'utiliser une aide de classe statique.

0
MatrixRonny