ModelStateExtensions.cs

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Web.Mvc;
  4.  
  5. namespace MvcSample.Extensions
  6. {
  7. public static class ModelStateExtensions
  8. {
  9. private static string GetErrorMessage(ModelError error, ModelState modelState)
  10. {
  11. if (!string.IsNullOrEmpty(error.ErrorMessage))
  12. {
  13. return error.ErrorMessage;
  14. }
  15. if (modelState.Value == null)
  16. {
  17. return error.ErrorMessage;
  18. }
  19. var args = new object[] { modelState.Value.AttemptedValue };
  20. return string.Format("属性的值不合法=值 '{0}' 非法!", args);
  21. }
  22.  
  23. public static object SerializeErrors(this ModelStateDictionary modelState)
  24. {
  25. return modelState.Where(entry => entry.Value.Errors.Any())
  26. .ToDictionary(entry => entry.Key, entry => SerializeModelState(entry.Value));
  27. }
  28.  
  29. private static Dictionary<string, object> SerializeModelState(ModelState modelState)
  30. {
  31. var dictionary = new Dictionary<string, object>();
  32. dictionary["errors"] = modelState.Errors.Select(x => GetErrorMessage(x, modelState)).ToArray();
  33. return dictionary;
  34. }
  35.  
  36. public static object ToDataSourceResult(this ModelStateDictionary modelState)
  37. {
  38. if (!modelState.IsValid)
  39. {
  40. return modelState.SerializeErrors();
  41. }
  42. return null;
  43. }
  44. }
  45. }

控制器

  1. [HttpPost]
  2. public ActionResult ModifyProduct(ProductInfoModifyViewModel viewModel,
  3. [ModelBinder(typeof(CommaSeparatedModelBinder))] List<int> orderStatusIds = null)
  4. {
  5. if (!ModelState.IsValid)
  6. {
  7. return Json(new DataSourceResult { Errors = ModelState.SerializeErrors() });
  8. }
  9. ProductInfoService.TryModifyById(viewModel.ProductId, viewModel.NewYear);
  10. return Json(new { Success = true, Message = "保存成功" });
  11. }

DataSourceResult

  1. public class DataSourceResult
  2. {
  3. public object ExtraData { get; set; }
  4.  
  5. public IEnumerable Data { get; set; }
  6.  
  7. public object Errors { get; set; }
  8.  
  9. public int Total { get; set; }
  10. }

前端(HTML)调用

  1. jQuery.ajax({
  2. type: "POST",
  3. url: "@Url.Action("ModifyProduct")",
  4. //data: { productId: productId, newYear: nowValue, orderStatusIds: "1,2,3,4", ProductName: " abc d e " }, //
  5. data: { productId: , ProductName: "" }, //
  6. success: function (data) {
  7. alert(data.Message);
  8. jObj.attr("old-value", nowValue);
  9. },
  10. error: function (xmlHttpRequest, textStatus, errorThrown) {
  11. alert(textStatus);
  12. }
  13. });

ProductInfoModifyViewModel.cs

  1. using MvcSample.Extensions;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel.DataAnnotations;
  5. using System.Linq;
  6. using System.Web;
  7.  
  8. namespace MvcSample.Models
  9. {
  10. public class ProductInfoModifyViewModel : BaseSkyViewModel
  11. {
  12. [Required]
  13. [Range(, int.MaxValue, ErrorMessage = "产品 ID 必须大于 0")]
  14. public int ProductId { get; set; }
  15.  
  16. /// <summary>
  17. /// 假设有一个这个 Property
  18. /// </summary>
  19. [Display(Name = "产品名称")]
  20. [Required(ErrorMessage = "{0}不能为空!")]
  21. [StringLength(, MinimumLength = , ErrorMessage = "{0}的长度必须在 {2} 和 {1} 之间")] //产品名称的长度必须在 1 和 30 之间
  22. public string ProductName { get; set; }
  23.  
  24. public int NewYear { get; set; }
  25. }
  26. }

运行效果:

  1. {
  2. "ExtraData": null,
  3. "Data": null,
  4. "Errors": {
  5. "ProductId": {
  6. "errors": ["产品 ID 必须大于 0"]
  7. },
  8. "ProductName": {
  9. "errors": ["产品名称不能为空!"]
  10. }
  11. },
  12. "Total":
  13. }

谢谢浏览!

ASP.NET MVC 下自定义 ModelState 扩展类,响应给 AJAX的更多相关文章

  1. ASP.NET MVC下自定义错误页和展示错误页的几种方式

    在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...

  2. ASP.NET MVC 下自定义模型绑定,去除字符串类型前后的空格

    直接贴代码了: SkyModelBinder.cs using System.ComponentModel; using System.Linq; using System.Web.Mvc; name ...

  3. ASP.NET MVC 下自定义 JsonResult,使用 Json.NET 序列化 JSON

    直接贴代码了: using System; using System.Web.Mvc; using Newtonsoft.Json; namespace MvcSample.Extensions { ...

  4. Response.End()在Webform和ASP.NET MVC下的表现差异

    前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...

  5. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  6. ASP.NET MVC下的四种验证编程方式【转】

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...

  7. 转:【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链

    [译]Asp.net MVC 利用自定义RouteHandler来防止图片盗链   你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你 ...

  8. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  9. Asp.Net MVC以 JSON传值扩展方法

    Asp.Net在客户端和服务器端,以JSON形式相互传值,可写扩展方法,用到的类型如下: DataContractJsonSerializer类: 该类在System.Runtime.Serializ ...

随机推荐

  1. Windows Server 2016-批量新建域用户(二)

    前几个章节我们讲到Windows Server 2016-图形化新建域用户(一),本章节我们简单讲解下如何通过命令批量创建域用户,以便高效完成日常工作中实际批量创建用户需求,内容涉及dsadd use ...

  2. Windows Server 2016-DNS客户端新增功能

    域名系统(DNS)是包含TCP / IP的行业标准协议套件之一,DNS客户端和DNS服务器一起为计算机和用户提供计算机名称到IP地址映射名称解析服务. 在Windows Server 2016中,DN ...

  3. 秋季学期学习总结&&以及下学期的期待

    秋季总结 第一学期已经结束了,下面来分点归纳下知识点: ·基础编程:利用c语言来进行编程 ·分支结构:利用if-else语句和switch语句编程,以及字符型数据的利用 ·循环结构:利用while.d ...

  4. css+js调整当前界面背景音量

    展示效果 html代码: <div> <audio id="audio" controls src="https://dbl.5518pay.com/r ...

  5. Sql基础(零基础学数据库_SqlServer版)

    刚开始学C#时候的笔记,只是些基础的语句如有错误请批评指正,谢谢,(使用SqlServer2012以上) 一.  数据库概述 SQI全称 structrued Query Language 1.数据: ...

  6. mpvue小程序开发之 城市定位

    背景: 在进行小程序开发时,有一个定位城市的需求,下面就来讲讲怎么实现这个功能的吧 解决方案: 小程序的wx.getLocation()获得是经纬度并不包含地名,所以要通过经纬度用相应的地图转换出地名 ...

  7. ansible基础-安装与配置

    一 安装 1.1 ansible架构 ansible是一个非常简单的自动化部署项目,由python编写并且开源.用于提供自动化云配置.配置文件管理.应用部署.服务编排和很多其他的IT自动化需求. an ...

  8. ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

    一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...

  9. ProgressWheelDialogUtil【ProgressWheel Material样式进度条对话框】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单封装网络请求时的加载对话框以及上传.下载文件的进度加载对话框. 效果图 代码分析 ProgressWheel : 自定义view ...

  10. LVS (一) 原理

    LVS原理概述 负载均衡就是,在多个提供相同服务主机的前段,增加一个分发器,根据用户请求,然后根据某种方式或者策略,将用户请求分发到提供服务的主机上.同时负载均衡应用还应该提供对后其后端服务健康检查的 ...