自定义数据注释ASP.NET MVC C#

Ste*_*ida 10 c# asp.net-mvc annotations model asp.net-mvc-2

我有关于使用C#的MVC 2的以下问题.

这是我的模型:

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

现在我想在我的视图中访问Tooltext项,例如:

@Html.ToolTextFor(Model => Model.Pmjob.Name)
Run Code Online (Sandbox Code Playgroud)

或在BL:

if ( Model.Pmjob.Name.Tooltext == "") {
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

mat*_*ieu 26

创建一个抽象类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);
}
Run Code Online (Sandbox Code Playgroud)

使您的属性继承自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);
    }
}
Run Code Online (Sandbox Code Playgroud)

创建自定义MetaDataProvider:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并替换默认值(global.asax.cs):

protected void Application_Start()
{
    // snipped

    ModelMetadataProviders.Current = new CustomModelMetadataProvider();
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以在视图中(或在Html Helper中)访问它:

(string)ViewData.ModelMetadata.AdditionalValues.Where(x => x.Key == "ToolText").SingleOrDefault()
Run Code Online (Sandbox Code Playgroud)

资源 :