Comment créer une méthode d'assistance HTML personnalisée DropDownFor dans ASP.Net MVC

asp.net-mvc c# expression-trees html-helper lambda

Question

J'essaie de créer une liste déroulante qui affichera une étiquette dans certaines conditions lorsque l'utilisateur n'y aura pas accès.

jusqu'à présent, je suis venu avec cette

public static MvcHtmlString ReadOnlyCapableDropDownFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression, 
        IEnumerable<SelectListItem> selectList, 
        bool enabled, 
        object htmlAttributes
)
{
     return !enabled ? htmlHelper.DisplayFor(expression)
          : htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);
}

Cela rend correctement une étiquette lorsqu'elle est activée est false et une liste déroulante lorsqu'elle est vraie. Le problème est que le texte de l'étiquette est l'id de la valeur de la liste de sélection sélectionnée plutôt que le texte qui serait normalement affiché dans la liste déroulante.

Cela est logique puisque j'utilise l'expression pour la valeur d'affichage, comment puis-je utiliser cette expression pour obtenir la valeur de texte de l'élément de liste de sélection plutôt que la valeur de données?

Réponse acceptée

Vous pouvez compiler l'expression et récupérer la valeur du modèle. Ensuite, choisissez le texte correct dans la liste selectList .

TProperty val = expression.Compile().Invoke(htmlHelper.ViewData.Model);
SelectListItem selectedItem = selectList.Where(item => item.Value == Convert.ToString(val)).FirstOrDefault();
string text = "";
if (selectedItem != null) text = selectedItem.Text;

return !enabled ? new MvcHtmlString("<span>" + text + "</span>")
      : htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);

Je pense que le retour d'une chaîne MvcHtmlString ad-hoc devrait suffire dans ce cas, car toutes les informations dont vous disposez sont contenues dans cette chaîne selectList . (Ce n'est pas comme si votre méthode d'assistance avait accès à des annotations de données, etc.)


Réponse populaire

Vous devrez rechercher la valeur du texte vous-même. Vous devriez pouvoir le faire dans cette routine puisque vous avez la liste de sélection disponible:

? htmlHelper.DisplayFor(selectList.Single(x=>x.Value == expression).Text

vous devrez peut-être évaluer l'expression avant de l'utiliser dans le code ci-dessus.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow