10 Stimmen

Ist es möglich, über eine benutzerdefinierte Anzeige oder eine Editorvorlage auf zusätzliche Metadaten zuzugreifen?

Ich weiß, dass ich in einer benutzerdefinierten Anzeige- oder Editiervorlage Metadaten über das Modell erhalten kann über ViewData.ModelMetadata die über Eigenschaften verfügt, die angeben, ob bestimmte Metadatenattribute für die Eigenschaft definiert wurden, wie z. B. IsRequired , DisplayName , und so weiter. Aber gibt es irgendeine Möglichkeit, auf benutzerdefinierte Metadaten zuzugreifen, die ich der Eigenschaft über benutzerdefinierte Attribute hinzugefügt habe?

Nehmen wir zum Beispiel an, dass ich in meiner Ansicht eine Eigenschaft wie diese habe:

[UIHint("Whizbang")]
[SomeAttribute("foobar")]
public string LeftWhizbang { get; set; }

Und ich habe eine benutzerdefinierte Anzeigevorlage namens Whizbang.cshtml mit dem folgenden Inhalt:

@model string

Left Whizbang Value: @Model

Ich möchte gerne feststellen können, ob die Eigenschaft LeftWhizbang ist mit dem Attribut SomeAttribute und, falls ja, möchte ich auf die Attribute Message Eigenschaft (sagen wir), nämlich den Wert "foobar".

Ich würde gerne so etwas in meiner Vorlage machen können:

@model string

Left Whizbang Value: @Model

@{
    SomeAttributeAttribute attr = ViewData.ModelMetadata.GetAttributes(...);
    if (attr != null)
    {
        <text>... and the value is @attr.Message</text>
    }
}

Ist dies überhaupt möglich, oder befinde ich mich in einer Sackgasse?

15voto

Buildstarted Punkte 26029

Sicher. Zuerst brauchen Sie Ihr Attribut, das die IMetadataAware so dass DataAnnotationsModelMetadataProvider weiß darüber Bescheid

public class TooltipAttribute : Attribute, IMetadataAware {
    public TooltipAttribute(string tooltip) {
        this.Tooltip = tooltip;
    }

    public string Tooltip { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata) {
        metadata.AdditionalValues["Tooltip"] = this.Tooltip;
    }
}

Sie können dann auf das Attribut zugreifen, indem Sie eine Hilfsmethode erstellen:

public static IHtmlString TooltipFor<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var data = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
    if (data.AdditionalValues.ContainsKey("Tooltip"))
        return new HtmlString((string)data.AdditionalValues["Tooltip"]);

    return new HtmlString("");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X