2 votes

Coincé sur l'extension Razor

J'essaie de refactoriser du code couramment utilisé dans une extension d'aide et je suis bloqué par la syntaxe, en grande partie parce que je n'ai pas une maîtrise totale des génériques, des expressions lambda, etc.

J'aimerais pouvoir mettre cela dans ma vue, et qu'elle utilise le champ de mon modèle (par exemple FirstName) pour produire du HTML qui utilise d'autres extensions de Razor :

@MyHelpers.BootstrapFormItem(m => m.FirstName)

En ce moment, j'ai :

@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Linq;
@using System.Linq.Expressions;

@helper BootstrapFormitem(XXXXXXXXX) 
{
         <div class="control-group">
            @Html.LabelFor(XXXXXXX)
            <div class="controls">
               @Html.DisplayFor(XXXXX)
               @Html.ValidationMessageFor(XXXX)
            </div>
         </div>
}

Questions :

  1. Est-ce la bonne approche ? J'aimerais pouvoir utiliser cette méthode avec n'importe quel champ de viewmodel.
  2. Ai-je inclus les bons espaces de noms ? Ceci va aller dans le dossier app_code
  3. Qu'est-ce qui va dans XXXXXX ?

2voto

naspinski Points 9810

Cette classe fait ce dont vous avez besoin, je les utilise tout le temps :

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class HtmlHelpers
{
    public static MvcHtmlString BootstrapFormItem<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {
        StringBuilder html = new StringBuilder("<div class=\"control-group\">");
        html.AppendLine(helper.LabelFor(expression).ToString());
        html.AppendLine("<div class=\"controls\">");
        html.AppendLine(helper.DisplayFor(expression).ToString());
        html.AppendLine(helper.ValidationMessageFor(expression).ToString());
        html.AppendLine("</div>");
        html.AppendLine("</div>");
        return MvcHtmlString.Create(html.ToString());
    }
}

Notez qu'il s'agit d'une classe statique et également d'une méthode d'extension, le premier paramètre d'entrée est préfixé par 'this' ce qui signifie qu'elle va étendre (s'afficher après avoir tapé '.' dans Intellisense) tous les objets de type HtmlHelper<TModel> . Je vais généralement mettre cette classe dans un Utilitaires dossier. J'utilise aussi souvent un espace de nom et je le référence à partir du dossier web.config .

MODIFIER POUR RÉPONDRE AUX QUESTIONS :

Voici l'usage, il est également couvert par Intellisense :

@model MyClass

@Html.BootstrapFormItem(x => x.Name)

Voici le résultat :

<div class="control-group">
    <label for="Name">Name</label>
    <div class="controls">
        naspinski
        <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"/>
    </div>
</div>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X