ASP.NET MVC 下自定义 ModelState 扩展类,响应给 AJAX
ModelStateExtensions.cs
- using System.Collections.Generic;
- using System.Linq;
- using System.Web.Mvc;
- namespace MvcSample.Extensions
- {
- public static class ModelStateExtensions
- {
- private static string GetErrorMessage(ModelError error, ModelState modelState)
- {
- if (!string.IsNullOrEmpty(error.ErrorMessage))
- {
- return error.ErrorMessage;
- }
- if (modelState.Value == null)
- {
- return error.ErrorMessage;
- }
- var args = new object[] { modelState.Value.AttemptedValue };
- return string.Format("属性的值不合法=值 '{0}' 非法!", args);
- }
- public static object SerializeErrors(this ModelStateDictionary modelState)
- {
- return modelState.Where(entry => entry.Value.Errors.Any())
- .ToDictionary(entry => entry.Key, entry => SerializeModelState(entry.Value));
- }
- private static Dictionary<string, object> SerializeModelState(ModelState modelState)
- {
- var dictionary = new Dictionary<string, object>();
- dictionary["errors"] = modelState.Errors.Select(x => GetErrorMessage(x, modelState)).ToArray();
- return dictionary;
- }
- public static object ToDataSourceResult(this ModelStateDictionary modelState)
- {
- if (!modelState.IsValid)
- {
- return modelState.SerializeErrors();
- }
- return null;
- }
- }
- }
控制器
- [HttpPost]
- public ActionResult ModifyProduct(ProductInfoModifyViewModel viewModel,
- [ModelBinder(typeof(CommaSeparatedModelBinder))] List<int> orderStatusIds = null)
- {
- if (!ModelState.IsValid)
- {
- return Json(new DataSourceResult { Errors = ModelState.SerializeErrors() });
- }
- ProductInfoService.TryModifyById(viewModel.ProductId, viewModel.NewYear);
- return Json(new { Success = true, Message = "保存成功" });
- }
DataSourceResult
- public class DataSourceResult
- {
- public object ExtraData { get; set; }
- public IEnumerable Data { get; set; }
- public object Errors { get; set; }
- public int Total { get; set; }
- }
前端(HTML)调用
- jQuery.ajax({
- type: "POST",
- url: "@Url.Action("ModifyProduct")",
- //data: { productId: productId, newYear: nowValue, orderStatusIds: "1,2,3,4", ProductName: " abc d e " }, //
- data: { productId: , ProductName: "" }, //
- success: function (data) {
- alert(data.Message);
- jObj.attr("old-value", nowValue);
- },
- error: function (xmlHttpRequest, textStatus, errorThrown) {
- alert(textStatus);
- }
- });
ProductInfoModifyViewModel.cs
- using MvcSample.Extensions;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Linq;
- using System.Web;
- namespace MvcSample.Models
- {
- public class ProductInfoModifyViewModel : BaseSkyViewModel
- {
- [Required]
- [Range(, int.MaxValue, ErrorMessage = "产品 ID 必须大于 0")]
- public int ProductId { get; set; }
- /// <summary>
- /// 假设有一个这个 Property
- /// </summary>
- [Display(Name = "产品名称")]
- [Required(ErrorMessage = "{0}不能为空!")]
- [StringLength(, MinimumLength = , ErrorMessage = "{0}的长度必须在 {2} 和 {1} 之间")] //产品名称的长度必须在 1 和 30 之间
- public string ProductName { get; set; }
- public int NewYear { get; set; }
- }
- }
运行效果:
- {
- "ExtraData": null,
- "Data": null,
- "Errors": {
- "ProductId": {
- "errors": ["产品 ID 必须大于 0"]
- },
- "ProductName": {
- "errors": ["产品名称不能为空!"]
- }
- },
- "Total":
- }
谢谢浏览!
ASP.NET MVC 下自定义 ModelState 扩展类,响应给 AJAX的更多相关文章
- ASP.NET MVC下自定义错误页和展示错误页的几种方式
在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...
- ASP.NET MVC 下自定义模型绑定,去除字符串类型前后的空格
直接贴代码了: SkyModelBinder.cs using System.ComponentModel; using System.Linq; using System.Web.Mvc; name ...
- ASP.NET MVC 下自定义 JsonResult,使用 Json.NET 序列化 JSON
直接贴代码了: using System; using System.Web.Mvc; using Newtonsoft.Json; namespace MvcSample.Extensions { ...
- Response.End()在Webform和ASP.NET MVC下的表现差异
前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...
- ASP.NET MVC下的四种验证编程方式
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...
- ASP.NET MVC下的四种验证编程方式【转】
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...
- 转:【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链
[译]Asp.net MVC 利用自定义RouteHandler来防止图片盗链 你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你 ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- Asp.Net MVC以 JSON传值扩展方法
Asp.Net在客户端和服务器端,以JSON形式相互传值,可写扩展方法,用到的类型如下: DataContractJsonSerializer类: 该类在System.Runtime.Serializ ...
随机推荐
- Windows Server 2016-批量新建域用户(二)
前几个章节我们讲到Windows Server 2016-图形化新建域用户(一),本章节我们简单讲解下如何通过命令批量创建域用户,以便高效完成日常工作中实际批量创建用户需求,内容涉及dsadd use ...
- Windows Server 2016-DNS客户端新增功能
域名系统(DNS)是包含TCP / IP的行业标准协议套件之一,DNS客户端和DNS服务器一起为计算机和用户提供计算机名称到IP地址映射名称解析服务. 在Windows Server 2016中,DN ...
- 秋季学期学习总结&&以及下学期的期待
秋季总结 第一学期已经结束了,下面来分点归纳下知识点: ·基础编程:利用c语言来进行编程 ·分支结构:利用if-else语句和switch语句编程,以及字符型数据的利用 ·循环结构:利用while.d ...
- css+js调整当前界面背景音量
展示效果 html代码: <div> <audio id="audio" controls src="https://dbl.5518pay.com/r ...
- Sql基础(零基础学数据库_SqlServer版)
刚开始学C#时候的笔记,只是些基础的语句如有错误请批评指正,谢谢,(使用SqlServer2012以上) 一. 数据库概述 SQI全称 structrued Query Language 1.数据: ...
- mpvue小程序开发之 城市定位
背景: 在进行小程序开发时,有一个定位城市的需求,下面就来讲讲怎么实现这个功能的吧 解决方案: 小程序的wx.getLocation()获得是经纬度并不包含地名,所以要通过经纬度用相应的地图转换出地名 ...
- ansible基础-安装与配置
一 安装 1.1 ansible架构 ansible是一个非常简单的自动化部署项目,由python编写并且开源.用于提供自动化云配置.配置文件管理.应用部署.服务编排和很多其他的IT自动化需求. an ...
- ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目
一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...
- ProgressWheelDialogUtil【ProgressWheel Material样式进度条对话框】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单封装网络请求时的加载对话框以及上传.下载文件的进度加载对话框. 效果图 代码分析 ProgressWheel : 自定义view ...
- LVS (一) 原理
LVS原理概述 负载均衡就是,在多个提供相同服务主机的前段,增加一个分发器,根据用户请求,然后根据某种方式或者策略,将用户请求分发到提供服务的主机上.同时负载均衡应用还应该提供对后其后端服务健康检查的 ...