zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    一个ball例程带你进入 Halcon 世界
    新公民读本
    open_window()到底做了什么?
    duilib学习领悟(4)
    duilib学习领悟(3)
    duilib学习领悟(2)
    通过Vue路由传参的两种方式及Vue组件中接收参数的方式
    彻底研透javascript中的对象及面向对象编程
    thinkphp5中使用phpmailer实现发送邮件功能
    小程序和ThinkPHP5结合实现登录状态(含代码)
  • 原文地址:https://www.cnblogs.com/pingjiang/p/1870676.html
Copyright © 2011-2022 走看看