2017-05-10 1 views
0

J'essaie d'étendre le HtmlHelper afin qu'il puisse traduire les noms de champs des entités Linq en utilisant un simple fichier de ressources. Le problème est que je ne peux pas obtenir la bonne signature de la méthode étendue. Voici le code:Ajout de HtmlHelper pour traduire le nom du champ en en-tête de colonne en utilisant le fichier de ressources

public static class HtmlHelperExtension 
{ 
    public static MvcHtmlString HeaderFromResource<TModel, 
     TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
    { 
     ... 
     return (MvcHtmlString)html.Raw(something) 
    } 
} 

Lorsque je tente de l'utiliser dans la vue, comme ceci:

@model IEnumerable<WebApp.Models.TransferInConfig> 
... 
<th> 
     @Html.HeaderFromResource(model => model.RemotePath) 
</th> 

je reçois l'erreur suivante:

'IEnumerable' does not contain a definition for 'RemotePath' and no extension method 'RemotePath'

+0

Editez votre question s'il vous plaît. Votre exemple de code a 'HeaderFromResource' et l'utilisation montre' @ Html.LabelForFromResouce (model => model.IncludeMask) 'et le message d'erreur est' RemotePath'. Rien n'est lié. – vendettamit

+0

Ajoutez également la définition de votre méthode Extension. – vendettamit

+0

Merci pour le heads up. – ByteArtisan

Répondre

0
public static MvcHtmlString HeaderFromResource<TModel, TValue>(this HtmlHelper<IEnumerable<TModel>> html, Expression<Func<TModel, TValue>> expression) 
{ 
    var headerName = expression.Body.ToString() //return model.Connection.RemotePath 
     .Split('.') 
     .Last(); 

    if (Properties.Resources.ResourceManager.GetString(headerName) != null) 
     headerName = Properties.Resources.ResourceManager.GetString(headerName); 

    return MvcHtmlString.Create(headerName);   

La seule chose que je devais faire était d'examiner sur le manuel pour la signature de DisplayForName, mais je ne l'utilise plus. Devrait être une meilleure façon d'obtenir le nom du champ de l'expression, de toute façon celui-ci travaille pour moi.

1

Eh bien, pour commencer votre modèle est un IEnumerable, il n'a en effet pas de définition RemotePath, mais les éléments qu'il contient (probablement). Donc, vous devrez d'abord parcourir votre liste de modèles et utiliser chaque élément. Quelque chose comme ça

foreach (var item in model){ 
    @Html.HeaderFromResource(item => item.RemotePath) 
} 
+0

True, mais la méthode HtmlHelper.DisplayForName accepte le IEnumerable. Mon problème est justement de savoir comment définir correctement la signature, je sais seulement que c'est une expression, mais j'ai des contraintes dont je ne suis pas conscient ou que je ne connais pas maintenant pour les codifier correctement. Cette solution fonctionnera probablement mais perd la capacité de supprimer des colonnes, changer l'ordre, etc ... Le but est seulement de pouvoir en traduire une à la fois. – ByteArtisan

+0

Si vous l'appliquez tout de suite peut-être. Mais vous pouvez ajouter des métadonnées. Comme ordre et visibilité: statut caché ou visible dans votre modèle pour refléter vos données. Cela activera la colonne de commande et d'affichage que vous mentionnez. – Khan

+0

Désolé, mais cela ne fait qu'ajouter au problème. – ByteArtisan