Question

Si je passe htmlAttributes dans un modèle, comme ceci:

@Html.DisplayFor(m => m.FirstName, new { htmlAttributes = new { @class = "orangetxt strongtxt" } })

Dans mon modèle, comment pourrais-je injecter ces dans mon HTML:

<span @ViewData["htmlAttributes"]>@Model</span>

Cela fonctionne presque, mais il fait des choses assez bizarre, donc je suppose que ce n'est pas la voie à suivre.

Je réalise que je peux accomplir ceci avec une méthode d'extension de HtmlHelper pour rendre l'élément HTML complet (span, dans ce cas) et de passer dans les attributs de cette façon, mais est-il possible de simplement rendre attributs directement dans un élément HTML, comme dans l'exemple ci-dessus?

Était-ce utile?

La solution

La méthode ci-dessous l'extension va me permettre de convertir htmlAttributes une chaîne:

    public static MvcHtmlString RenderHtmlAttributes<TModel>(
        this HtmlHelper<TModel> htmlHelper, object htmlAttributes)
    {
        var attrbituesDictionary = new RouteValueDictionary(htmlAttributes);

        return MvcHtmlString.Create(String.Join(" ", 
            attrbituesDictionary.Select(
                item => String.Format("{0}=\"{1}\"", item.Key, 
                htmlHelper.Encode(item.Value)))));
    }

Ensuite, pour les rendre dans la balise, je peux faire ceci:

<span @Html.RenderHtmlAttributes(ViewData["htmlAttributes"])>@Model</span>

Autres conseils

Jerad La réponse de Rose est bonne, mais je suis tombé sur quelques problèmes avec elle:

  • Il ne convertissait pas underscores des tirets dans les noms d'attributs
  • Il ne gère pas les attributs sans valeur avec élégance

Pour répondre à la première question, l'utilisation HtmlHelper.AnonymousObjectToHtmlAttributes.

Voici ma modification de la méthode de Jerad:

public static MvcHtmlString RenderHtmlAttributes(this HtmlHelper helper, object htmlAttributes)
{
        if (htmlAttributes == null) return new MvcHtmlString(String.Empty);
        var attrbituesDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        return new MvcHtmlString(String.Join(" ", attrbituesDictionary.Select(item => string.IsNullOrEmpty((string)item.Value) ? String.Format("{0}", item.Key) : String.Format("{0}=\"{1}\"", item.Key, helper.Encode(item.Value)))));
}

Essayez plutôt ceci,

@Html.DisplayFor(m => m.FirstName, 
                 new { htmlAttributes = "class = orangetxt strongtxt"})

Cela rend une chaîne, alors que votre version ne fait des trucs bizarres, { rendu de } dans le cadre de la sortie.

DisplayFor() est utilisé pour rendre le modèle qui correspond au type de propriété.

modèles d'affichage sont des fichiers .cshtml intérieur / DisplayTemplates dossier qui est à son tour dans un dossier de vue (par exemple un dossier de maison, partagée ou même un contrôleur spécifique).

Un exemple.

Si vous avez un String.cshtml modèle comme celui-ci à l'intérieur / Vues / Shared :

@model String

@if (string.IsNullOrEmpty(Model)) {
   <span>(no string)</span>
}
else {
   <span>@Model</span>
}

Chaque fois que vous appelez DisplayFor() pour une propriété de chaîne:

DisplayFor(model => model.MyStringProperty);

Il rend le modèle en conséquence à la valeur de la chaîne. Vous pouvez être plus précis et de mettre / DisplayTemplates dans un dossier Affichage spécifique et les appels que de ces points de vue sont touchés par le modèle.


Dans votre cas, vous pouvez être encore plus précis et DisplayFor() d'appel avec un modèle particulier.

Supposons que vous avez un modèle pour une propriété particulière, appelée MyPropertyTemplate.cshtml. Vous appelleriez DisplayFor() comme ceci:

DisplayFor(model => model.MyProperty, "MyPropertyTemplate");

Et eux, à l'intérieur de ce modèle, vous pouvez avoir de tous les attributs HTML que vous voulez.

@model MyProperty

<span class="orangetxt strongtxt">@MyProperty.ToString()</span>

PS:. Quand il ne trouve pas un modèle que je suppose qu'il appelle que model.Property.ToString() sans html supplémentaire

Pour votre information:. EditorFor(), par exemple, fonctionne d'une manière similaire, mais il utilise / EditorTemplates dossier

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top