标签:
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; } } } }
调用示例:
public ActionResult ValidateModelTest(string jsonModel) { List<PersonModel> list = JsonConvert.DeserializeObject<List<PersonModel>>(jsonModel); if (this.ValidateModelExtensions(list)) { return Content("ok"); } else { return Content("参数异常"); } }
搞定。
现在就可以用它去实现各种业务需求啦。
C# MVC 进入Action 方法之后怎么使用MVC参数验证模型
标签:
原文地址:http://www.cnblogs.com/liuyu7177/p/5581382.html