mvc的控制器

控制器-各种ActionResult   

ASP.NET MVC几种ActionResult的本质

我们所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件。而它的返回类型是ActionResult如

  1. public ActionResult Index()  
  2. {  
  3.       
  4.     return View();  
  5. }  

除了View()之外那我们这里还能用于返回什么值呢?


<1>ascx页面

场景:要返回代码片断,比如Ajax返回一个子页

让我们先建立一个TestController.cs控制器;我们先新建一个Action


  1. public ActionResult Ascx()  
  2. {  
  3.     return PartialView();  
  4. }  

然后给这个Action添加一个视图Ascx.cshtml
  1. @{  
  2.     Layout = null;  
  3. }  
  4.   
  5. <!DOCTYPE html>  
  6.   
  7. <html>  
  8. <head>  
  9.     <meta name="viewport" content="width=device-width" />  
  10.     <title>Ascx</title>  
  11. </head>  
  12. <body>  
  13.     <div>  
  14.        <table border="1">  
  15.         <tr><th>中国</th><th>美国</th><th>英国</th></tr>  
  16.         <tr><th>湖南</th><th>纽约</th><th>巴黎</th></tr>  
  17.        </table>   
  18.     </div>  
  19. </body>  
  20. </html>  
在浏览器中运行 http://localhost:8439/Test/Ascx   得到的结果是一个ascx页面



<2>返回文本 

在Test控制器下添加一个Action方法

  1. public ActionResult Text()  
  2. {  
  3.     return Content("这是一段文本"); //往前台输出一个字符串  
  4.       
  5.     //它相当于以下两句代码:  
  6.     //Response.write("这是一段文本");  
  7.     //Response.End(); //End 方法使 Web 服务器停止处理脚本并返回当前结果。文件中剩余的内容将不被处理。如果 Response.Buffer 已设置为 TRUE,则调用 Response.End 将缓冲输出  
  8. }  

这个连视图都不用添加

直接在浏览器中运行 http://localhost:8439/Test/Text   结果是在网页上输出“这是一段文本”这么一行字


<3.1>返回Json

有时我们在调用Ajax时还会要求返回对象为Json序列化的结果,如:

  1. public ActionResult ShowJson()  
  2. {  
  3.   
  4.     var userinfo = new { Name = "奥巴马", Age = 56 };  
  5.     return Json(userinfo, JsonRequestBehavior.AllowGet);  
  6.   
  7.     //var tempObj = new { Controller = "DemoController", Action = "JsonResultDemo" };  
  8.     //return Json(tempObj,JsonRequestBehavior.AllowGet);    
  9.   
  10.     //JsonRequestBehavior.AllowGet表示:允许来自客户端的 HTTP GET 请求  
  11.     //return Json(User, JsonRequestBehavior.AllowGet);   
  12. }  
在浏览器中运行 http://localhost:8439/Test/ShowJson  然后就弹出一个窗体让你保存ShowJson.json文件。


保存图片后,用记事本打开文件,文件的内容是 :{"Name":"奥巴马","Age":56}

<3.2>返回Json

  1. /// <summary>  
  2. /// 返回一个JSON数据  
  3. /// </summary>  
  4. /// <param name="pageIndex">当前页码</param>  
  5. /// <returns>JSON数据</returns>  
  6. public JsonResult Paging(int pageIndex)  
  7. {  
  8.     //从数据库查询数据  
  9.     var query = ((from a in db.T_User  
  10.                   where a.Id > pageIndex * 5  
  11.                   select a).Take(5)).ToList();  
  12.   
  13.     JsonResult json = new JsonResult();  
  14.     json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;  //允许来自客户端的HTTP GET请求  
  15.     json.Data = new  
  16.     {  
  17.         result = query, //将从数据库中查询出来的数据赋值给jsond对象。  
  18.     };  
  19.     return json;  
  20. }  

<4>输出JS文件

大多时候js文件都是静态的,但有时js文件可能也要动态生成这时我们可以这样输出:

  1. public ActionResult Js()  
  2. {  
  3.     return JavaScript("var x=0;");  
  4. }  
在浏览器中运行:http://localhost:8439/Test/Js  弹出一个窗体:如下



保存后,用记事本打开Js.js文件 内容是: var x=0;


<5>页面跳转

1.跳转到Action

  1. public ActionResult rdaction()  
  2. {  
  3.     return RedirectToAction("Text""Test");//跳转到Test控制下的Text方法  
  4. }  

在浏览器中运行:http://localhost:8439/Test/rdaction  于是立刻就跳转到 http://localhost:8439/Test/Text页面了,于是输出


2.跳转到Url

  1. public ActionResult rdurl()  
  2. {  
  3.     return Redirect("http://www.baidu.com");  
  4. }  
在浏览器中运行:http://localhost:8439/Test/rdurl  于是立刻就跳转到百度的首页了。

3.跳转到Routing规则

  1. public ActionResult rdrouting() //跳转到Routing规则  
  2. {  
  3.     return RedirectToRoute("Default",//Route名  
  4.       new  
  5.       {  
  6.           Controller = "Test",  
  7.           Action = "Ascx"  
  8.       });  
  9. }  

在浏览器中运行:http://localhost:8439/Test/rdrouting  于是立刻就跳转到 Test控制器下的Ascx方法了,即跳转到http://localhost:8439/Test/Ascx 页面了

于是就输出 http://localhost:8439/Test/Ascx页面的内容




<6>显示文件

  1. public ActionResult fn()  
  2. {  
  3.     return File("d:/123.jpg","jpg/png/JPEG");                 
  4. }  

在浏览器中运行:http://localhost:8439/Test/fn    弹出一个对话框:如下

点击保存后,选择用图片查看器打开。显示出了 D盘下的123.jpg图片


<7> 返回一个空的页面

  1. public ActionResult EmptyResultDemo()  
  2. {  
  3.     //仅仅用来占位,没有任何的逻辑。与return null是一样的  
  4.     return new EmptyResult(); //空方法    
  5. }   

在浏览器中运行 : http://localhost:8439/Test/EmptyResultDemo   得到的是一个空空如也的空白页


<8>输出流文件

  1. public ActionResult FileStreamResultDemo()//将d盘下的haha.jpg文件转化成一个文件流,返回到前台  
  2. {  
  3.     FileStream fs = new FileStream("d:/haha.jpg", FileMode.Open, FileAccess.Read);  
  4.     return File(fs, @"jpg/image/gif");//记得这个File()方法有6个重载哦。到时候可以使用以下哦。  
  5. }   
运行浏览器:http://localhost:8439/Test/FileStreamResultDemo  弹出一个对话框
选择保存。保存后,选择用图片查看器打开,就显示了一幅D盘下的 haha.jpg文件



<9> 返回一个响应状态码


  1. //HttpStatusCodeResult()这要是用来防盗链的。 例如:当博客园里有个哥们在博客园里发布了一个帖子,帖子里放了一个<img src="http://www.jd.con/img/1.jpg">的图片。 当用户访问博客园,浏览这个帖子的时候,浏览器解析到有这么个<img src="http://www.jd.con/img/1.jpg">的图片,于是就向京东的这个网站请求这幅图片。此时京东的服务器就做了一个判断,判断你这个请求的上一次请求URL地址是谁? 于是发现这个请求的上一个地址是http://wwww.cnblogs.com/abc.html。这个地址是博客园的地址,所以此时京东的服务就返回一个404的状态码。表示这幅图片不存在(其实是京东不想给你看,如果上一次的请求是从京东本网过来的话,图片就给你看了。)  
  2.       public ActionResult HttpStatusCodeResultDemo()  
  3.       {  
  4.           //动态修改响应状态码。给请求返回一个404的响应  
  5.   
  6.           //404:资源找不到 500:服务器错误 304:缓存  302:重定向  
  7.           return new HttpStatusCodeResult(404);  
  8.       }   
当控制器返回404的状态码的时候,执行这个视图的时候,浏览器的反应是




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值