重定向会引起浏览器提交整个新的HTTP请求,这意味着无法访问原始的请求的细节。如果想将数据从一个请求传递到下一个请求,可以使用TempData()方法。
TempData类似于Session,不同的是TempData在被读取以后会被标记删除,并且当请求被处理的时候被移除。这是一个针对想在整个重定向过程中保持短期数据的非常完美的安排。如下示例:
首先添加一个MySecond控制器,并添加对应的视图,视图引擎为Razor并编写如下代码:
MySecond控制器代码
public class MySecondController : Controller { public ActionResult Index() { TempData["Message"] = "Hello TempData"; TempData["Data"] = "TempData的值只能读取一次"; return View(); } public ActionResult TempDataTest() { return View(); } }
Index视图代码
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta content="width=device-width" /> <title>Index</title> </head> <body> <div> the Data is:@TempData["Data"] </div> </body> </html>
TempDataTest视图代码
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta content="width=device-width" /> <title>TempDataTest</title> </head> <body> <div> the Data is:@TempData["Data"]<br/> the Message is:@TempData["Message"] </div> </body> </html>
运行结果如下:
注意:在Index里面没有读取TempData["Message"]的值,但是Index和TempDataTest都读取了TempData["Data"]的值。这样做是为了验证TempData里面的值在不同的视图只能读取一次。
TempData里面的值在一次请求里面只能读取一次。 如果我们想读取TempData的值但是又不让它被删除,可以使用TempData.Peek(“Data”)方法。 如果想在保持一次TempData里面的值,可以使用TempData.Keep("Data")。
3.5、返回文本数据
Content方法参数说明: 发送的文本数据、响应的HTTP content-type header、编码格式。 可以忽略最后两个参数,在MVC框架假定数据是HTML(content type为text/html)情况下,它会查询一种浏览器声明支持的编码格式。
3.6、返回XML数据
using LinqService; using System.Xml.Linq; public ContentResult GetXMLData() { List<Books> books = bll.GetListBooks(); XElement data = new XElement("BooksList", books.Select(e => { return new XElement("Books", new XAttribute("title", e.Title), new XAttribute("author", e.Author), new XAttribute("Price", e.Price.ToString())); })); }
3.7、返回JSON数据
public ActionResult JSON() { JsonResult json = new JsonResult(); UserInfo userinfo=new UserInfo{ ID=1,, Age=11 }; List<UserInfo> list=new List<UserInfo>{ new UserInfo{ ID=1,, Age=11 }, new UserInfo{ ID=1,, Age=11 }, new UserInfo{ ID=1,, Age=11 }, new UserInfo{ ID=1,, Age=11 } }; //json.Data = list; //json.JsonRequestBehavior = JsonRequestBehavior.AllowGet; //return json; //return new JsonResult() { Data = list, JsonRequestBehavior=JsonRequestBehavior.AllowGet }; return Json(userinfo,JsonRequestBehavior.AllowGet); }
JSON是一个轻量级的基于文本格式,用来描述分层数据结构的, JSON是有效的javascript代码,这意味着被所有的主流浏览器支持
在MVC框架里面内置了JsonResult类,让我们能够序列化.NET对象为json格式。通过Json方法可以创建返回JsonResult结果类型
3.8、返回文件和二进制数据
public FileResult AnnualReport() { string filename = @"D:\C#高级编程.doc"; string contentType = "application/doc"; string downloadName = "C#高级编程2013.doc"; return File(filename, contentType, downloadName); }
如果不知道具体的MIME类型,可以指定contentType 为application/octet-stream
lFileResult是一个抽象基类,其三个实现的子类 :
1.FilePathResult :直接把服务器的某个路径下的文件发给浏览器
2.FileContentResult :发送一个内存中的二进制数据给浏览器
3.FileStreamResult:发送已经打开的文件流内容给浏览器。
3.9、返回错误和HTTP Codes
发送特定的HTTP结果码
可以使用HttpStatusResult类将一个特定的HTTP状态码发送给浏览器。这个类没有对应的控制器辅助器方法,因此必须直接对这个类进行实例化,如下所示:
public HttpStatusCodeResult StatusCode() { return new HttpStatusCodeResult(404,"file not found"); }
发送404结果
可以使用便利的HttpNotFoundResult类来获取上面相同的效果,这个类派生于HttpStatusResult,而且可以用控制器的便利方法HttpNotFound来创建。如下所示:
public HttpStatusCodeResult StatusCode() { return HttpNotFound(); }
发送401结果
另一个特定的HTTP状态码的封装程序类是HttpUnauthorizeResult,它返回401代码,用来指示一个未授权请求。如下所示:
public HttpStatusCodeResult StatusCode() { return new HttpUnauthorizedResult(); }