mvc .net 中,从服务器端跳转页面有很多方法
有些不会改变浏览器地址栏的地址,这个好理解,mvc本身的机制就是action的名字不一定是view的名字
我们请求的不是文件名,在action中我们可以任意调用其它的action
有些跳转方式,是会改变浏览器地址栏的
webform的开发者常用的跳转方式,直接将js代码返回到客户端,并触发
mvc也可以用,如
return Content("<script language='javascript'>window.open('aaa.aspx');</script>");
这种方法也好理解,但是另一种会改变地址栏的方法:
Redirect
是通过什么方式通知浏览器去重定向地址栏的呢?
这其实是很基础的web开发知识,但是我确实不知道
以RedirectToAction为例,
<form action="TestRedirect" method="post"> 测试跳转 <input type="submit" value="提交" /> </form>
[HttpPost] public ActionResult TestRedirect() { return RedirectToAction("Contact", "Home"); }
开始以为,是通过底层的方式注入了js,所以查看post返回的信息
response是空的
既然没有人为代码的干预,那可以肯定是浏览器接受到了指令,自动重定向了地址栏
好歹记得headers在服务器端也会变,查看header
|
发现Request Headers 中,有目标地址。
测试普通post
[HttpPost] public ActionResult TestRedirect() { return Content("test"); }
结果:
|
发现没有Location这个参数
猜测是不是有Location浏览器就会自动跳转
[HttpPost] public ActionResult TestRedirect() { Response.AddHeader("Location", "/Home/Contact"); return Content("test"); }
失败,不会跳转
对比headers,又发现一个差异。Status Code是不一样的
普通的post,Status Code 是 200
redirect post的Status Code: 是 302
测试:
[HttpPost] public ActionResult TestRedirect() { Response.AddHeader("Location", "/Home/Contact"); Response.StatusCode = 302; return Content("test"); }
成功跳转,另外如果Location不存在,只修改status,也不会跳转
结论:
Redirect 的原理是通过修改status来通知浏览器来重定向 .
当然,搞明白这个,或许没什么用(用这个方法来跳转页面看起来很诡异,因为貌似不管在哪种架构里都有redirect)
不过至少涨了点zishi,StatusCode 是有很多实际意义的,之前一直不知道
http://www.w3school.com.cn/tags/html_ref_httpmessages.asp