2011-04-05 22 views
9

Tengo la siguiente pregunta sobre MVC 2 con C#.Anotaciones de datos personalizadas ASP.NET MVC C#

Aquí es mi modelo:

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

Ahora quiero llegar al punto Tooltext mi punto de vista, e. g .:

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

o en el BL:

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

Es esto posible?

Respuesta

25

Crear una MetaDataAttribute clase abstracta:

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

Haga su atributo heredan de 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); 
    } 
} 

Cree el MetaDataProvider personalizado:

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

Y sustituir el nombre predeterminado (global .asax.cs):

protected void Application_Start() 
{ 
    // snipped 

    ModelMetadataProviders.Current = new CustomModelMetadataProvider(); 
} 

Por último, se puede acceder a él en su opinión (o en un asistente de HTML):

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

Fuente:

+0

felicitaciones a el autor de la publicación del blog, ya que no pude encontrar mi código de nuevo :) – mathieu

Cuestiones relacionadas