在mvc的项目中,我们前台做一些操作时,后台要返回一些结果给前台,这个时候我们就需要有一个状态来标识到底是什么类型的错误,

  例如:

    执行删除的时候,如果操作成功(1行受影响),我们需要返回状态为1并输出返回 “ 删除成功 ” 等提示语

    执行删除的时候,如果没有做任何操作(0行受影响),我们需要返回状态为2并输出返回 “ 删除失败  ”等提示语

    执行删除的时候,如果直接抛异常,我们需要返回状态为3并输出返回 “ 执行sql异常  ”等提示语

代码如下:

[HttpPost]
public ActionResult DelRequest(int id)
{
try
{
if (proBLL.Delete(id))
{
return Json("{\"status\":\"1\",\"msg\":\"删除成功\"}", JsonRequestBehavior.AllowGet);
}
else
{
return Content("{\"status\":\"2\",\"msg\":\"删除失败\"}");
}
}
catch
{
return Content("{\"status\":\"3\",\"msg\":\"删除失败\"}");
} }

但是这样写是不是很麻烦(虽然可以赋值粘贴),而且也不是很好控制容易出错,所以渐渐的想写自定义返回json格式数据的方法给前台

我们来看看源码:

在通过反编译工具我在System.Web.Mvc程序集中看到有一个类叫JsonResult

JsonResult(class JsonResult : ActionResult) 类源码如下:

namespace System.Web.Mvc
{
public class JsonResult : ActionResult
{
public Encoding ContentEncoding
{
get;
set;
} public string ContentType
{
get;
set;
} public object Data
{
get;
set;
} public JsonRequestBehavior JsonRequestBehavior
{
get;
set;
} public int? MaxJsonLength
{
get;
set;
} public int? RecursionLimit
{
get;
set;
} public JsonResult()
{
this.JsonRequestBehavior = JsonRequestBehavior.DenyGet;
} public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
}
HttpResponseBase response = context.HttpContext.Response;
if (!string.IsNullOrEmpty(this.ContentType))
{
response.ContentType = this.ContentType;
}
else
{
response.ContentType = "application/json";
}
if (this.ContentEncoding != null)
{
response.ContentEncoding = this.ContentEncoding;
}
if (this.Data != null)
{
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
if (this.MaxJsonLength.HasValue)
{
javaScriptSerializer.MaxJsonLength = this.MaxJsonLength.Value;
}
if (this.RecursionLimit.HasValue)
{
javaScriptSerializer.RecursionLimit = this.RecursionLimit.Value;
}
response.Write(javaScriptSerializer.Serialize(this.Data));
}
}
}
}

前面先不过,我们可以看到里面有一个方法 public override void ExecuteResult(ControllerContext context),首先接受一个控制器上下文,后面判断是否允许GET请求什么的等,最后通过 response.Write(javaScriptSerializer.Serialize(this.Data)); 把我们传入的数据序列化给前台

既然我们找到了核心类,但是我们如何使用它了?,其实我们可以看到在Controller类中有几个重载的Json方法:

protected internal JsonResult Json(object data);
protected internal JsonResult Json(object data, string contentType);
protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);
protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior);

我们看源码可以很清楚直到前面的几个重载都是调用的最后一个重载方法

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior);

源码如下:

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}

哦,原来直接返回了一个JsonResult方法,那么我们是不是也可以写一个Json的重载,或则自定义一个方法,并调用此方法了?

修改如下:

首先我们可以定义一个枚举

public enum ReturnStatus
{
SUCCESS = ,
FAIL = ,
EXCEPTION =
}

错误消息类:

public class Message
{
public int Status { get; set; }
public string Mes { get; set; }
}

然后我们写一个BaseController继承Controller类,并添加一个方法JsonResult

/// <summary>
/// 返回json格式的数据给前台
/// </summary>
/// <param name="status">错误标识</param>
/// <param name="message">错误消息</param>
/// <param name="behavior">是否允许</param>
/// <returns></returns>
protected internal JsonResult JsonResult(ReturnStatus status,string message , JsonRequestBehavior behavior = JsonRequestBehavior.DenyGet)
{

    return this.Json(new Message
    {
      Status = Convert.ToInt32(status),
      Mes = message
    },"application/json", Encoding.UTF8, behavior);

}

使用:

[HttpPost]
public ActionResult DelRequest(int id)
{
try
{
if (proBLL.Delete(id))
{
return JsonResult(ReturnStatus.SUCCESS, "删除成功");
}
else
{
return JsonResult(ReturnStatus.FAIL, "删除失败");
}
}
catch
{
return JsonResult(ReturnStatus.EXCEPTION, "删除失败");
} }

最后总结:

所有的扩展都是看源码出来的,而不是百度出来的

所以一定要多看源码,一定要多看源码,一定要多看源码,一定要多看源码,一定要多看源码........

3.自定义返回json格式的数据给前台(自定义Controller类中的Json方法)的更多相关文章

  1. python字典转化成json格式。JSONEncoder和JSONDecoder两个类来实现Json字符串和dict类型数据的互相转换

    遇到问题:进行Webservice接口测试时,对接口入参数据进行了处理,变成了dict格式,去进行接口请求报错. 需要转成成json格式,双引号去扩. 如下: 更改代码: # 在Python标准库的j ...

  2. 如何使用python内置的request发送JSON格式的数据

    使用步骤如下: 一.如果想发送json格式的数据,需要使用request模块中的Request类来创建对象,作为urlopen函数的参数 二.header中添加content-type为applica ...

  3. ASP.NET API(MVC) 对APP接口(Json格式)接收数据与返回数据的统一管理

    话不多说,直接进入主题. 需求:基于Http请求接收Json格式数据,返回Json格式的数据. 整理:对接收的数据与返回数据进行统一的封装整理,方便处理接收与返回数据,并对数据进行验证,通过C#的特性 ...

  4. asp.net MVC控制器中返回JSON格式的数据时提示下载

    Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...

  5. $.ajax返回的JSON格式的数据后无法执行success的解决方法

    近段时间做项目,在项目使用了ajax技术,遇到了一个奇怪的问题:"$.ajax返回的JSON格式的数据无法执行success",代码是这样写的: 1 $.ajax({ 2 .. 3 ...

  6. SSH返回Json格式的数据

      在开发中我们经常遇到客户端和后台数据的交互,使用比较多的就是json格式了.在这里以简单的Demo总结两种ssh返回Json格式的数据 项目目录如下 主要是看 上图选择的部分 WebRoot里面就 ...

  7. 在IE中MVC控制器中返回JSON格式的数据时提示下载

    最近做项目时,视图中用jquery.form.js异步提交表单时,接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如 ...

  8. WebAPI搭建(二) 让WebAPI 返回JSON格式的数据

    在RestFul风格盛行的年代,对接接口大多数人会选择使用JSON,XML和JSON的对比传送(http://blog.csdn.net/liaomin416100569/article/detail ...

  9. 人人商城返回Json格式的数据

    人人商城返回Json格式的数据 1.找到该插件对应的 core/mobile 路径 2.新建一个 api.php 文件 <?php header('Content-Type:applicatio ...

随机推荐

  1. DELPHI 把数据库中的数据转换成XML格式

    function ReplaceString(AString: string): string; begin Result := StringReplace(AString, '&', '&a ...

  2. centos环境下安装java环境

    1-上java官网下载rpm安装包 jdk-7u80-linux-i586.rpm 2-新建文件夹,并把jdk-7u80-linux-i586.rpm上传到此文件夹下面 cd /usr/local/ ...

  3. 使用 Select2 下拉框实现复选

    使用 Select2 下拉框实现复选 <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...

  4. linux下rpm包安装、配置和卸载mysq

    l   WIN10下虚拟机:VMware workstation 12 PRO 安装 # 1.查看系统版本 [root@vm-xiluhua][/home/xiluhua]$ cat /etc/red ...

  5. python实现获取文件的绝对路径

    实现代码如下: #获取文件的绝对路径import osclass GetPath: def get_path(self,path): r=os.path.abspath(path) return ri ...

  6. 【ABAP系列】SAP ABAP模块-查找系统出口或BADI的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-查找系统出 ...

  7. 应用安全-Web安全-越权漏洞整理

    login->register GetPhone->GetPasswd GetPwd->GetPassword 遍历https://xx.com/contacts/new?user_ ...

  8. Codeforces Round #410 (Div. 2)B. Mike and strings(暴力)

    传送门 Description Mike has n strings s1, s2, ..., sn each consisting of lowercase English letters. In ...

  9. jQuery 动态添加、删除css样式

    1.addClass css中: <style type="text/css">       .chColor {background: #267cb7;color:w ...

  10. JS动态添加Easyui的HTML时样式丢失

    解决办法: $.parser.parse($("#creatLi").html(<li>xxxxxx</li>)); ------------------- ...