码迷,mamicode.com
首页 > Windows程序 > 详细

C# MVC 进入Action 方法之后怎么使用MVC参数验证模型

时间:2016-06-13 19:06:19      阅读:1410      评论:0      收藏:0      [点我收藏+]

标签:

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

搞定。

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

C# MVC 进入Action 方法之后怎么使用MVC参数验证模型

标签:

原文地址:http://www.cnblogs.com/liuyu7177/p/5581382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!