asp.net mvc自定义MetadataProvider

自定义元数据提供程序

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

namespace ValidationSample

{

public class ConventionMetadataProvider : AssociatedMetadataProvider

{

public ConventionMetadataProvider() : base()

{

}

protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)

{

var metadata = new ModelMetadata(this, containerType, modelAccessor, modelType, propertyName);

if (propertyName == null)

return metadata;

if (propertyName.EndsWith("Id"))

{

metadata.TemplateHint = "HiddenInput";

metadata.HideSurroundingChrome = true;

}

if (propertyName.EndsWith("X"))

{

metadata.IsRequired = true;

}

metadata.DisplayName = propertyName.TrimEnd('X').Wordify();

return metadata;

}

}

public static class Extensions

{

public static string Wordify(this string str)

{

string newString = "";

foreach(char c in str) {

newString += char.IsUpper(c) ? " " + c : c.ToString();

}

return newString;

}

}

}

自定义验证提供程序

using System;

using System.Collections.Generic;

using System.Web.Mvc;

namespace ValidationSample

{

public class ConventionValidatorProvider : AssociatedValidatorProvider

{

protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context,

IEnumerable<Attribute> attributes)

{

if (metadata.IsRequired)

{

yield return new MyRequiredValidator(metadata, context);

}

}

#region Nested type: MyRequiredValidator

public class MyRequiredValidator : ModelValidator

{

internal MyRequiredValidator(ModelMetadata metadata, ControllerContext context)

: base(metadata, context)

{

}

public override IEnumerable<ModelValidationResult> Validate(object container)

{

var result = new List<ModelValidationResult>();

if (Metadata.Model == null)

result.Add(new ModelValidationResult

{

MemberName = Metadata.PropertyName,

Message = string.Format("{0} is required", Metadata.DisplayName)

});

return result;

}

public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()

{

yield return new ModelClientValidationRequiredRule("This field is required");

}

}

#endregion

}

}

最后在全局文件中配置

protected void Application_Start()

{

ModelMetadataProviders.Current = new ConventionMetadataProvider();

ModelValidatorProviders.Current = new ConventionValidatorProvider();

RegisterRoutes(RouteTable.Routes);

}