在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. 字符串(二):string

    字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string string 是 C++ STL 的一个字符串类型,原型是 vector<char> 并对字符串处理做 ...

  2. 笨办法学Python(learn python the hard way)--练习程序11-20

    #ex11.py1 print("How old are you?",end=''), age = input() print("How tall are you?&qu ...

  3. 高级Javascript代码

    Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的,补充送那啥邀请码. 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 &q ...

  4. 轮询,WebSocket和P2P--记一次QQ交谈IM

    问题:

  5. vue2.0 之 douban (七)APP 打包

    在打包之前需要修改一个地方,那就是config->index.js文件,修改assetsPublicPath: '/'为assetsPublicPath: './',截图如下 上面文件改好后,开 ...

  6. CentOS7配置Tomcat8开机自动启动

    1.创建文件 # vi /etc/systemd/system/tomcat.service [Unit] Description=Tomcat8540 After=syslog.target net ...

  7. Logistic Regression Algorithm解决分类问题

    在线性回归算法中,我们看到,在training set中,输入矩阵X与向量y的值都是连续的.所以在二维空间中,我们可以用一条直线去模拟X与y的变化关系,寻找参数向量theta的取值.如根据房屋面积预测 ...

  8. python操作mysql之增删改查

    [insert] import MySQLdb conn = MySQLdb.connect(","08day5" ) cur = conn.cursor() #把数据放 ...

  9. 使用pycharm调试远程服务器上的程序

    一.PyCharm实现远程调试代码 1. 和远程服务器建立连接,tools àDeploymentàConfiguration 2. 点击“+”号,按照远程服务器信息配置信息 点击“Advanced ...

  10. rm 删除文件太多

    在工程环境下,一个文件夹包含有100多万个文件,这时用命令去删除这些文件: rm -rf * 会出现报错如下: /bin/rm: cannot execute [Argument list too l ...