zoukankan      html  css  js  c++  java
  • C# MVC 进入Action 方法之后怎么使用MVC参数验证模型

    Action 接收的是json字符串,然后在把字符串序列化为实体,序列化完之后怎么再使用mvc自带的参数验证框架来验证参数, 这个问题困扰了我好久。也许有人说,调用接口的时候,加一个请求头,把contentype设置为application/json ,action 方法就可以用实体接受json的参数啦。但是我面对的不是这种情况。我需要解决的就是接受json字符串,然后序列化为实体。不要为我为什么,我就是那么固执。哈哈

    解决方案直接上代码,通过给Controller添加扩展方法满足了我的需求,有一点要注意的是,在Controller调用扩展方法时,一定要用this.xxx.好了上代码

    扩展方法:

    using System;
    using System.Collections;
    using System.Linq.Expressions;
    using System.Web.Mvc;
    
    namespace Lyt.Framework
    {
        public static partial class ControllerExtensions
        {
    
            public static bool ValidateModelExtensions(this Controller controller, object model) 
            {
                return ValidateModelExtensions(controller, model, null);
            }
    
            private static bool ValidateModelExtensions(this Controller controller, object model, string prefix = null) 
            {
                if (model == null)
                {
                    throw new ArgumentNullException("model");
                }
                if (model is IEnumerable)
                {
                    foreach (var item in model as IEnumerable)
                    {
                        ValidateModelBase(controller, item, prefix);
                    }
                }
                else
                {
    
                    ValidateModelBase(controller, model, prefix);
                }
                return controller.ModelState.IsValid;
            }
    
            private static void ValidateModelBase(Controller controller, object model, string prefix)
            {
                ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType());
    
                foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(metadata, controller.ControllerContext).Validate(null))
                {
                    controller.ModelState.AddModelError(CreateSubPropertyName(prefix, validationResult.MemberName),validationResult.Message);
                }
            }
    
    
    
            private static string CreateSubPropertyName(string prefix, string propertyName)
            {
                if (String.IsNullOrEmpty(prefix))
                {
                    return propertyName;
                }
                else if (String.IsNullOrEmpty(propertyName))
                {
                    return prefix;
                }
                else
                {
                    return prefix + "." + propertyName;
                }
            }
        }
    }
    View Code

    调用示例:

    public ActionResult ValidateModelTest(string jsonModel)
            {
                List<PersonModel> list = JsonConvert.DeserializeObject<List<PersonModel>>(jsonModel);
                if (this.ValidateModelExtensions(list))
                {
                    return Content("ok");
                }
                else
                {
                    return Content("参数异常");
                }
            }
    View Code

    搞定。

    现在就可以用它去实现各种业务需求啦。

  • 相关阅读:
    poj3613 求经过n条边的最短路 ----矩阵玩出新高度 。
    牛客练习赛43 Tachibana Kanade Loves Game (简单容斥)
    牛客练习赛43 Tachibana Kanade Loves Review C(最小生成树Kruskal)
    牛客练习赛43 Tachibana Kanade Loves Probability(快速幂)
    哈尔滨工程大学ACM预热赛 G题 A hard problem(数位dp)
    poj 3252 Round Numbers(数位dp 处理前导零)
    hdu 3652 B-number(数位dp)
    poj 3666 Making the Grade(离散化+dp)
    poj 3186 Treats for the Cows(dp)
    poj 1661 Help Jimmy (dp)
  • 原文地址:https://www.cnblogs.com/liuyu7177/p/5581382.html
Copyright © 2011-2022 走看看