2. 這是最常見(jiàn)的一種轉向方法;
HyperLink控件
1. Asp.net 服務(wù)器端控件 屬性NavigateUrl指定要跳轉到的Url地址
2. NavigateUrl是可以在服務(wù)器端使用代碼修改,這個(gè)區別于<a
3. 由于HyperLink本身沒(méi)有事件所以要在服務(wù)器端其它事件中設置NavigateUrl
4. 代碼示例
<Asp:HyperLink id=”hyperlink” runat=”server” NavigatoeUrl=”test.aspx”ok</Asp:HyperLink
Response.Redirect()方法
1. 過(guò)程:發(fā)送一個(gè)Http響應到客戶(hù)端,通知客戶(hù)端跳轉到一個(gè)新的頁(yè)面,然后客戶(hù)端再發(fā)送跳轉請求到服務(wù)器端。
2. 頁(yè)面跳轉之后內部控件保存的所有信息丟失,當A跳轉到B,B頁(yè)面將不能訪(fǎng)問(wèn)A頁(yè)面提交的數據信息。
3. 使用這個(gè)方法使用這個(gè)方法跳轉后瀏覽器地址欄的Url信息改變
4. 可以使用Session Cookies Application等對象進(jìn)行頁(yè)面間的數據傳遞
5. 重定向操作發(fā)生在客戶(hù)端,總共涉及到兩次與Web服務(wù)器的通信:一次是對原始頁(yè)面的請求,另一次是重定向新頁(yè)面的請求
Server.Transfer()方法
1. 實(shí)現頁(yè)面跳轉的同時(shí)將頁(yè)面的控制權進(jìn)行移交
2. 頁(yè)面跳轉過(guò)程中Request Session等保存的信息不變,跳轉之后可以使用上一個(gè)頁(yè)面提交的數據
3. 跳轉之后瀏覽器地址欄的Url不變
4. 這種方法的重定向請求是在服務(wù)器端的進(jìn)行的,瀏覽器不知道頁(yè)面已經(jīng)發(fā)生了一次跳轉
Server.Execute()方法
1. 該方法允許當前頁(yè)面執行同一個(gè)Web服務(wù)器上的另一個(gè)頁(yè)面
2. 頁(yè)面執行完畢之后重新回到原始頁(yè)面發(fā)出Server.Execute()的位置。
3. 這種方式類(lèi)似針對頁(yè)面的一次函數調用 被請求的頁(yè)面可以使用原始頁(yè)面的表單數據和查詢(xún)字符串集合
4. 被調用頁(yè)面的Page指令的EnableViewStateMac屬性設置為FalseJavaScriptstring str = "<script language=javascripthistory.go(-2);</script";
Response.Write(str);相關(guān):
1. 為了確保HTML輸出的合法性 最好使用Response.Redirect方法;因為Server.Execute 或者Server.Transfer方法返回給客戶(hù)端的頁(yè)面包含多個(gè)<Html<body標記,不是合法的HTML頁(yè)面,在非IE瀏覽器中可能會(huì )發(fā)生錯誤。
需求:spring MVC框架controller間跳轉,需重定向。
有幾種情況:不帶參數跳轉,帶參數拼接url形式跳轉,帶參數不拼接參數跳轉,頁(yè)面也能顯示。本來(lái)以為挺簡(jiǎn)單的一件事情,并且個(gè)人認為比較常用的一種方式,一百度全都有了,這些根本不是問(wèn)題,但是一百度居然出乎我的意料,一堆都不是我想要的結果。
無(wú)奈啊,自己寫(xiě)一篇比較全都供以后大家一百度吧,哈哈哈。
是這些寫(xiě)的不是很全都人們給了我寫(xiě)這篇博客的動(dòng)力。
2. 解決辦法 需求有了肯定是解決辦法了,一一解決,說(shuō)明下spring的跳轉方式很多很多,我這里只是說(shuō)一些自我認為好用的,常用的,spring分裝的一些類(lèi)和方法。 (1)我在后臺一個(gè)controller跳轉到另一個(gè)controller,為什么有這種需求呢,是這樣的。
我有一個(gè)列表頁(yè)面,然后我會(huì )進(jìn)行新增操作,新增在后臺完成之后我要跳轉到列表頁(yè)面,不需要傳遞參數,列表頁(yè)面默認查詢(xún)所有的。 方式一:使用ModelAndView return new ModelAndView("redirect:/toList"); 這樣可以重定向到toList這個(gè)方法 方式二:返回String return "redirect:/ toList "; 其它方式:其它方式還有很多,這里不再做介紹了,比如說(shuō)response等等。
這是不帶參數的重定向。 (2)第二種情況,列表頁(yè)面有查詢(xún)條件,跳轉后我的查詢(xún)條件不能丟掉,這樣就需要帶參數的了,帶參數可以拼接url 方式一:自己手動(dòng)拼接url new ModelAndView("redirect:/toList?param1="+value1+"¶m2="+value2); 這樣有個(gè)弊端,就是傳中文可能會(huì )有亂碼問(wèn)題。
方式二:用RedirectAttributes,這個(gè)是發(fā)現的一個(gè)比較好用的一個(gè)類(lèi) 這里用它的addAttribute方法,這個(gè)實(shí)際上重定向過(guò)去以后你看url,是它自動(dòng)給你拼了你的url。 使用方法: attr.addAttribute("param", value); return "redirect:/namespace/toController"; 這樣在toController這個(gè)方法中就可以通過(guò)獲得參數的方式獲得這個(gè)參數,再傳遞到頁(yè)面。
過(guò)去的url還是和方式一一樣的。 (3)帶參數不拼接url頁(yè)面也能拿到值(重點(diǎn)是這個(gè)) 一般我估計重定向到都想用這種方式: @RequestMapping("/save") public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr) throws Exception { String code = service.save(form); if(code.equals("000")){ attr.addFlashAttribute("name", form.getName()); attr.addFlashAttribute("success", "添加成功!"); return "redirect:/index"; }else{ attr.addAttribute("projectName", form.getProjectName()); attr.addAttribute("enviroment", form.getEnviroment()); attr.addFlashAttribute("msg", "添加出錯!錯誤碼為:"+rsp.getCode().getCode()+",錯誤為:"+rsp.getCode().getName()); return "redirect:/maintenance/toAddConfigCenter"; } }@RequestMapping("/index") public String save(@ModelAttribute("form") Bean form,RedirectAttributes attr) throws Exception { return "redirect:/main/list"; }頁(yè)面取值不用我說(shuō)了吧,直接用el表達式就能獲得到,這里的原理是放到session中,session在跳到頁(yè)面后馬上移除對象。
所以你刷新一下后這個(gè)值就會(huì )丟掉。3. 總結 最底層還是兩種跳轉,只是spring又進(jìn)行了封裝而已,所以說(shuō)跳轉的方式其實(shí)有很多很多種,你自己也可以封一個(gè),也可以用最原始的response來(lái),也沒(méi)有問(wèn)題。
好了,就到這兒。
1.<a href="Default.aspx"跳轉</a
2.<asp:HyperLink id="HyperLink1" runat="server" NavigateUrl="Default.aspx"跳轉</asp:HyperLink
3.Response.Redirect(url) //第一種跳轉方法
4.Server.Transfer(url) //第二種跳轉方法
5.Sever.Execute(url) //第二種跳轉方法
二、使用說(shuō)明
1-2.這里說(shuō)一下HyperLink的功能和<a href="#"</a一樣的。如果想要提交到服務(wù)器端跳轉需要使用LinkButton控件,可以實(shí)現多種鏈接效果,并且與button、imagebutton的功能是一樣滴~。
3.Response.Redirect():首先發(fā)送一個(gè)HTTP響應到客戶(hù)端,通知客戶(hù)端跳轉到一個(gè)新的頁(yè)面,然后客戶(hù)端再發(fā)送跳轉請求道服務(wù)器端。在頁(yè)面跳轉后內部控件保存的所有數據信息將丟失,因此當頁(yè)面A跳轉到頁(yè)面B,頁(yè)面B將無(wú)法訪(fǎng)問(wèn)頁(yè)面A中提交的數據信息,跳轉頁(yè)面后瀏覽器地址欄的URL信息轉變。
4.Server.Transfer():在實(shí)現頁(yè)面跳轉的同時(shí)將頁(yè)面處理的控制權進(jìn)行移交。頁(yè)面A跳轉到頁(yè)面B后可以繼續使用頁(yè)面A中提交的數據信息。此方法由頁(yè)面A跳轉到頁(yè)面B后,瀏覽器的地址仍保持頁(yè)面A的URL信息。
5.Server.Execute():允許當前頁(yè)面執行同一Web服務(wù)器上的另一頁(yè)面,當另一頁(yè)面執行完畢后,控制流程重新返回到原頁(yè)面發(fā)出Server.Execute的調用位置。
希望它的默認頁(yè)是index.html頁(yè),在vs2010中給站點(diǎn)根目錄增加了index.html,然后調用沒(méi)有什么問(wèn)題,但部署到IIS7上,在功能試圖=》默認文檔添加了index.html,但是只輸入域名還是訪(fǎng)問(wèn)不到,看來(lái)還是.net mvc和IIS不兼容的原因,后來(lái)同事采用的辦法是在global文件中把默認頁(yè)面寫(xiě)成一個(gè)需要登錄的頁(yè)面,這樣因為沒(méi)有權限,系統會(huì )自動(dòng)跳轉到登錄頁(yè)面
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名稱(chēng)
"{controller}/{action}/{id}", // 帶有參數的 URL
new { controller = "IndexPage", action = "Index", id = UrlParameter.Optional } // 參數默認值
);
}
朋友找到了一個(gè)很好的博文,感覺(jué)實(shí)現方法更加靈活,具體如下:
方法1:
在Global.asax文件中增加
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Context.Request.FilePath == "/") Context.RewritePath("index.html");
}
方法2:
新建一個(gè)路由DefaultController,并把它設置為默認路由,在A(yíng)ction中增加
Redirect(Url.Content("~/index.html"));
此方法需要修改web.config配置
在Web.config文件中的節點(diǎn)中增加:
方法3:
1)站點(diǎn)根目錄增加了default.html;
2)修改Global.asax默認的路由注冊,去掉默認controller:
routes.MapRoute(
"Default", // 路由名稱(chēng)
"{controller}/{action}/{id}", // 帶有參數的 URL
new {action = "Index", id = UrlParameter.Optional } // 參數默認值
);
將iis中的默認文檔配置為index.html
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:3.701秒