So erstellen Sie eine benutzerdefinierte HTML-Helper-Methode DropDownFor in ASP.Net MVC

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

Frage

Ich versuche, eine Dropdown-Box zu erstellen, die unter bestimmten Bedingungen ein Label darstellt, wenn der Benutzer keinen Zugriff darauf hat.

Bisher bin ich auf dieses Thema gekommen

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);
}

Wenn die Option "false" aktiviert ist und die Dropdown-Liste "false" lautet, besteht das Problem darin, dass der Text der Beschriftung die ID des ausgewählten Auswahllistenwerts und nicht der Text ist, der normalerweise in der Dropdown-Liste angezeigt wird.

Dies ist sinnvoll, da ich den Ausdruck für den Wert der Anzeige verwende, wie verwende ich diesen Ausdruck, um den Wert des Auswahllistenelements anstelle des Datenwerts zu erhalten?

Akzeptierte Antwort

Sie könnten den Ausdruck kompilieren und den Wert aus dem Modell abrufen. Wählen Sie dann den richtigen Text aus der 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);

Ich denke, die Rückgabe eines Ad-hoc- MvcHtmlString sollte in diesem Fall ausreichen, da alle Informationen, die Sie haben, in dieser selectList- Zeichenfolge enthalten sind. (Es ist nicht so, als hätte Ihre Hilfsmethode Zugriff auf Datenanmerkungen usw.)


Beliebte Antwort

Sie müssen den Textwert selbst nachschlagen. Sie sollten dies in dieser Routine tun können, da Sie die Auswahlliste zur Verfügung haben:

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

Allerdings müssen Sie den Ausdruck möglicherweise auswerten, bevor Sie ihn im obigen Code verwenden.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum