Пользовательские аннотации данных ASP.NET MVC C # - PullRequest
10 голосов
/ 05 апреля 2011

У меня есть следующий вопрос о MVC 2 с C #.

Вот моя модель:

public class Pmjob
{
   [Tooltext="Hier soll der Name eingegeben werden"]
   [DisplayName("Type")]
   public int Name { get; set; }
}

Теперь я хочу достичь элемента Tooltext в моем представлении, например:

@Html.ToolTextFor(Model => Model.Pmjob.Name)

или в BL:

if ( Model.Pmjob.Name.Tooltext == "") {
}

Возможно ли это?

1 Ответ

26 голосов
/ 05 апреля 2011

Создать абстрактный класс MetaDataAttribute:

public abstract class MetadataAttribute : Attribute
{
    /// <summary>
    /// Method for processing custom attribute data.
    /// </summary>
    /// <param name="modelMetaData">A ModelMetaData instance.</param>
    public abstract void Process(ModelMetadata modelMetaData);
}

Заставьте ваш атрибут наследоваться от MetaDataAttribute:

public class ToolTextAttribute : MetadataAttribute
{
    public string Text { get; set; }
    public TooltextAttribute(string text)
    {
        this.Text = new text;
    }

    public override void Process(ModelMetadata modelMetaData)
    {
        modelMetaData.AdditionalValues.Add("ToolText", this.Text);
    }
}

Создание пользовательского провайдера метаданных:

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes,
        Type containerType,
        Func<object> modelAccessor,
        Type modelType,
        string propertyName)
    {
        var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
        attributes.OfType<MetadataAttribute>().ToList().ForEach(x => x.Process(modelMetadata));
        return modelMetadata;
    }
}

И заменить значение по умолчанию (global.asax.cs):

protected void Application_Start()
{
    // snipped

    ModelMetadataProviders.Current = new CustomModelMetadataProvider();
}

Наконец, вы можете получить к нему доступ в своем представлении (или в Html Helper):

(string)ViewData.ModelMetadata.AdditionalValues.Where(x => x.Key == "ToolText").SingleOrDefault()

Источник:

...