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