亚洲国产日韩欧美在线a乱码,国产精品路线1路线2路线,亚洲视频一区,精品国产自,www狠狠,国产情侣激情在线视频免费看,亚洲成年网站在线观看

ASP.NET 2.0 中跨網(wǎng)頁(yè)提交的方法有哪三種

時(shí)間:2024-08-14 14:44:47 ASP 我要投稿
  • 相關(guān)推薦

ASP.NET 2.0 中跨網(wǎng)頁(yè)提交的方法有哪三種

  當(dāng)在一個(gè)ASP.NET

  Web頁(yè)面中進(jìn)行操作時(shí),在默認(rèn)情況下向當(dāng)前頁(yè)進(jìn)行提交。這種行為在ASP.NET出現(xiàn)之前并沒(méi)有什么關(guān)系,但在ASP.NET中當(dāng)我們想向另外一個(gè)Web頁(yè)提交一個(gè)Web

  Form時(shí)該如何做呢?在ASP.NET1.0中這個(gè)問(wèn)題變得很難解決,但在ASP.NET2.0中為開(kāi)發(fā)人員提供了更容易的解決的技術(shù):跨網(wǎng)頁(yè)提交。這種技術(shù)允許一個(gè)網(wǎng)頁(yè)在提交數(shù)據(jù)時(shí)提交給另外的一個(gè)頁(yè)面。在跨網(wǎng)頁(yè)提交中,用于初始化提交代碼的頁(yè)面叫源頁(yè)面,而客戶提交的頁(yè)面叫目標(biāo)頁(yè)面。

  為了方便起見(jiàn),目標(biāo)頁(yè)面仍然獲得原頁(yè)面提交的所有數(shù)據(jù)。換名話說(shuō),從技術(shù)觀點(diǎn)出發(fā),我們可以用同樣的方式處理其他ASP.NET頁(yè)面提交的數(shù)據(jù)。

  這個(gè)新特性意味著ASP.NET2.0開(kāi)發(fā)人員目前有三種可供選擇的技術(shù)來(lái)將數(shù)據(jù)從一個(gè)web頁(yè)面?zhèn)魉偷搅硗庖粋(gè)頁(yè)面。這三種方法是:響應(yīng)重定向,服務(wù)端傳輸和新的跨網(wǎng)頁(yè)提交特性。我們可以已經(jīng)熟悉前兩種技術(shù)了,因此,我們只是簡(jiǎn)要地復(fù)習(xí)一下它們,然后我們會(huì)將主要精力放到學(xué)習(xí)如何使用跨網(wǎng)頁(yè)提交特性,以及闡述一下這種方法和響應(yīng)重定向以及服務(wù)傳輸方式有什么不同。

  一、響應(yīng)重定向方法

  響應(yīng)重定向方法是目前為止將一個(gè)網(wǎng)頁(yè)重定向到另一個(gè)網(wǎng)頁(yè)的最簡(jiǎn)單的方法的最簡(jiǎn)單的方法。當(dāng)Web服務(wù)器接到一個(gè)重定向請(qǐng)求后,它會(huì)將一個(gè)響應(yīng)頭送給客戶端,這將導(dǎo)致客戶端發(fā)送一個(gè)新的請(qǐng)求到服務(wù)器。按句話說(shuō),一個(gè)重定向請(qǐng)求實(shí)際上是兩個(gè)請(qǐng)求響應(yīng):一個(gè)是最初的請(qǐng)求響應(yīng),另一個(gè)是新的重定向請(qǐng)求響應(yīng)。

  在ASP.NET中實(shí)現(xiàn)重定向很容易。下面的代碼演示了如何使用Response.Redirect方法實(shí)現(xiàn)網(wǎng)頁(yè)重定向:

  protected

  void

  Redirect_Click(object

  sender,

  EventArgs

  e)

  {

  Response.Redirect("menu.aspx");

  }

  要注意的是重定向請(qǐng)求只是一個(gè)GET請(qǐng)求,這就意味著我們不能從源頁(yè)中通過(guò)重定向命令提交數(shù)據(jù)。但是我們可以在重定向中使用查詢字符串來(lái)傳遞數(shù)據(jù)。如下面代碼所示:

  protected

  void

  Redirect_Click(object

  sender,

  EventArgs

  e)

  {

  Response.Redirect("menu.aspx?userName="

  UserName.Text));

  }

  上面的例子將一個(gè)查詢字符串作為參數(shù)傳遞給了Response.Redirect方法的目標(biāo)URL。我們可以通過(guò)如下的代碼獲得源數(shù)據(jù)。

  protected

  void

  Page_Load(object

  sender,

  EventArgs

  e)

  {

  string

  userName

  Request["userName"];

  }

  二、服務(wù)器傳輸方法

  和依賴于客戶端向另一個(gè)新頁(yè)發(fā)請(qǐng)求不同,服務(wù)器傳輸是一種服務(wù)器重定向技術(shù),這種技術(shù)通過(guò)簡(jiǎn)單的改變Web服務(wù)器所處理的代碼來(lái)達(dá)到請(qǐng)求一個(gè)新頁(yè)的目的。當(dāng)被請(qǐng)求頁(yè)和源頁(yè)面在同一個(gè)服務(wù)器時(shí),服務(wù)器傳輸要比Response.Redirect方法更有效,這是由于這種技術(shù)可以避免額外的開(kāi)銷,僅僅使用服務(wù)器的資源就可以進(jìn)行重定向。要注意的這種技術(shù)有一個(gè)副作用,在頁(yè)面進(jìn)行重定向時(shí),客戶端的URL仍然會(huì)保持源頁(yè)面的URL,這可能會(huì)使客戶認(rèn)為他們所獲得的數(shù)據(jù)是源頁(yè)面產(chǎn)生的。當(dāng)然,在大多數(shù)情況下,這不是問(wèn)題,但是這將使調(diào)試變得更困難。

  Server.Transfer方法還可以保存初始頁(yè)的HttpContext。因此,目標(biāo)頁(yè)可以訪問(wèn)源頁(yè)面的值。我們可以使用FormsCollection屬性來(lái)從目標(biāo)頁(yè)面中獲得源頁(yè)面的值。首先,要確定我們使用了被重載的方法,這個(gè)方法有兩個(gè)參數(shù):目標(biāo)URL和一個(gè)Boolean類型的值,告訴服務(wù)器是否保存用于描述源頁(yè)面值的Form。如下面的代碼所示:

  [NextPage]

  Server.Transfer("Menu.aspx",true);

  然后,我們?cè)谀繕?biāo)頁(yè)面中獲得一個(gè)叫txtUserName的Textbox控件的值的代碼如下:

  object

  obj

  Request.Form["txtUserName"];

  三、Response.Redirect和Server.Transfer的比較

  由于Response.Redirect方法要進(jìn)行兩次請(qǐng)求響應(yīng)操作,因此,我們應(yīng)該在對(duì)性能要求高的網(wǎng)站盡量避免使用這種方法。然而,只從技術(shù)上說(shuō),使用redirect方式確實(shí)可以從一個(gè)網(wǎng)頁(yè)跳到另一個(gè)網(wǎng)頁(yè)。相比之下,Server.Transfer會(huì)更有效率,但是跳轉(zhuǎn)的范圍僅限于同一個(gè)Web服務(wù)器的不同網(wǎng)頁(yè)。從本質(zhì)上說(shuō),我們可以使用Server.Transfer來(lái)消除不必要的請(qǐng)求響應(yīng)操作。如果我們需要重定位到不同服務(wù)器的網(wǎng)頁(yè),就需要使用Response.Redirect方法。

  四、跨頁(yè)提交概述

  在ASP.NET

  2.0中,我們可以通過(guò)實(shí)現(xiàn)IbuttonControl接口提交給不同的WebForm,來(lái)實(shí)現(xiàn)跨網(wǎng)頁(yè)的提交。和Response.Redirect類似,跨網(wǎng)頁(yè)提交是一個(gè)基于客戶端的傳輸機(jī)制,但也有點(diǎn)象Server.Transfer,目標(biāo)網(wǎng)頁(yè)也可以訪問(wèn)源網(wǎng)頁(yè)的數(shù)據(jù)。為了使用跨網(wǎng)頁(yè)提交,我們需要在源網(wǎng)頁(yè)中的PostBackUrl屬性中指定目標(biāo)URL。

  五、實(shí)現(xiàn)跨網(wǎng)頁(yè)提交

  這部分將討論一下如何在ASP.NET2.0中實(shí)現(xiàn)跨網(wǎng)頁(yè)提交。為了開(kāi)始我們的學(xué)習(xí),假設(shè)有兩個(gè)Web頁(yè),一個(gè)是源Web頁(yè),另一個(gè)是目標(biāo)Web頁(yè)。在源網(wǎng)頁(yè)中初始化了使用按鈕進(jìn)行的跨網(wǎng)頁(yè)提交操作。我們首先必須設(shè)置目標(biāo)網(wǎng)頁(yè)按鈕的PostBackUrl屬性,順便說(shuō)一句,所有實(shí)現(xiàn)了System.Web.UI.WebControls.IbuttonControl接口的Web控件都有跨網(wǎng)頁(yè)提交的特性。下面的代碼將演示這一過(guò)程。

  PostBackUrl="~/target.aspx"

  text

  "Post

  to

  a

  target

  page"/>

  當(dāng)我們?cè)O(shè)置PostBackUrl屬性時(shí),ASP.NET框架將相應(yīng)的控件綁定到一個(gè)新的叫WebForm_DoPostBackWithOptions的JavaScript函數(shù),產(chǎn)生的Html代碼如下:

  onclick="javascript:WebForm_DoPostBackWithOptions(

  new

  WebForm_PostBackOptions("btnSubmit",

  false,

  "Target.aspx",

  false,

  false))"

  id="btnSubmit"

  />

  對(duì)于上面的html代碼來(lái)說(shuō),當(dāng)用戶單擊按鈕時(shí),瀏覽器將提交目標(biāo)URL(Target.aspx),而不是源URL。

  六、從目標(biāo)頁(yè)面中獲得源頁(yè)面控件的值

  ASP.NET2.0提供了一個(gè)叫PreviousPage的新的屬性,這個(gè)屬性無(wú)論在何時(shí)當(dāng)前頁(yè)面進(jìn)行跨網(wǎng)頁(yè)提交操作時(shí)都會(huì)指向源頁(yè)面。要注意的是,當(dāng)源頁(yè)面和目標(biāo)頁(yè)面在不同的應(yīng)用程序中時(shí),這個(gè)屬性包含null(這個(gè)null并不是未初始化的意思)。還有要注意的是當(dāng)目標(biāo)網(wǎng)頁(yè)訪問(wèn)PreviousPage屬性時(shí)可以獲得源頁(yè)面的數(shù)據(jù),ASP.NET運(yùn)行時(shí)裝載并執(zhí)行了源頁(yè)面。這將引發(fā)ProcessChildRequest事件的發(fā)生。而且,它還會(huì)引發(fā)Page_Init事件、Page_Load和任何其他的源頁(yè)面按鈕單擊事件。

  因此,我們要避免由于不小心進(jìn)行誤操作,所以最好通過(guò)IsCrossPostBack屬性來(lái)確認(rèn)是否為一個(gè)跨網(wǎng)頁(yè)提交發(fā)生,如果這個(gè)屬性值為true,那么目標(biāo)網(wǎng)頁(yè)就是通過(guò)一個(gè)跨網(wǎng)頁(yè)提交動(dòng)作而調(diào)用的。如果是通過(guò)另外一種方式調(diào)用的(如一般的請(qǐng)求、Response.Redirect或是一個(gè)Server.Transfer),這個(gè)屬性的值為false。下面的例子演示了如何使用這個(gè)屬性。

  if

  PreviousPage.IsCrossPagePostBack)

  {

  //執(zhí)行代碼

  }[NextPage]

  這個(gè)PreviousPage屬性在Server.Transfer和跨網(wǎng)頁(yè)提交中都可以使用。在ASP.NET2.0中,我們可以在調(diào)用Server.Transfer操作后使用PreviousPage屬性在目標(biāo)頁(yè)面中來(lái)獲得源頁(yè)面的數(shù)據(jù),代碼如下:

  {

  Server.Transfer("menu.aspx");

  }

  protected

  void

  Redirect_Click(object

  sender,

  EventArgs

  e)

  在這個(gè)接收面中我們現(xiàn)在可以獲得Web頁(yè)面的數(shù)據(jù),代碼如下:

  protected

  void

  Page_Load(object

  sender,

  EventArgs

  e)

  {

  if

  (PreviousPage

  null)

  {

  TextBox

  txtBox

  (TextBox)

  PreviousPage.FindControl("txtUserName");

  if

  (textBox

  null)

  string

  userName

  textBox.Text;

  //其他可執(zhí)行的代碼

  }

  }

  要注意的是上面的代碼必須將txtUserName控件轉(zhuǎn)換為TextBox類型,以便可以訪問(wèn)其中的值。

  七、使用PreviousPageType

  PreviousPageType屬性提供了在跨網(wǎng)頁(yè)操作中訪問(wèn)源頁(yè)面的強(qiáng)類型能力,下面讓我們演示一下如何不通過(guò)任何類型轉(zhuǎn)換來(lái)從源頁(yè)面中獲得控件值。代碼如下:

  <

  asp:Textbox

  ID="txtUserName"

  Runat="server"

  />

  <

  asp:Textbox

  ID="txtPassword"

  Runat="server"

  />

  <

  asp:Button

  ID="Submit"

  Runat="server"

  Text="Login"

  PostBackUrl="Menu.aspx"

  />

  要注意的是單擊按鈕可以重定向到一個(gè)叫“Menu.asp”的目標(biāo)頁(yè)。這個(gè)目標(biāo)頁(yè)可以使用如下的代碼獲得用戶名和密碼:

  八、保存視圖狀態(tài)

  對(duì)于跨網(wǎng)頁(yè)提交來(lái)說(shuō),ASP.NET2.0

  內(nèi)嵌了一個(gè)叫__POSTBACK的隱藏字段,這個(gè)字段包含了關(guān)于源頁(yè)面的視圖信息

  也就是由源頁(yè)面提供了,包含了一個(gè)帶有一個(gè)非空PostBackUrl屬性值的服務(wù)端控件。目標(biāo)頁(yè)可以使用__POSTBACK中的信息來(lái)獲得源頁(yè)面的視圖狀態(tài)信息。代碼如下:

  if(PreviousPage!=null

  &&

  PreviousPage.IsCrossPagePostBack

  &&

  PreviousPage.IsValid)

  {

  TextBox

  txtBox

  PreviousPage.FindControl("txtUserName");

  Response.Write(txtBox.Text);

  }

  在上面的代碼中核對(duì)了用于確保PreviousPage屬性不為null的檢查代碼。順便提一下,如果目標(biāo)頁(yè)和源頁(yè)面不在同一個(gè)應(yīng)用程序中,這個(gè)PreviousPage屬性的值為null。只有在進(jìn)行跨網(wǎng)頁(yè)提交操作時(shí),IsCrossPagePostBack屬性才為true。

  這個(gè)跨網(wǎng)頁(yè)提交的特性,是ASP.NET2.0中最強(qiáng)有力的特性之一,這種技術(shù)將允許在一個(gè)頁(yè)面中提交到另外一個(gè)頁(yè)面,并且可以在目標(biāo)頁(yè)面地?zé)o縫地操作源頁(yè)面中的數(shù)據(jù)。

  asp.net 2.0 權(quán)限樹(shù)的控制

  做權(quán)限的時(shí)候,主要實(shí)現(xiàn)如下功能

  1、該節(jié)點(diǎn)可以訪問(wèn),則他的父節(jié)點(diǎn)也必能訪問(wèn);

  2、該節(jié)點(diǎn)可以訪問(wèn),則他的子節(jié)點(diǎn)也都能訪問(wèn);

  3、該節(jié)點(diǎn)不可訪問(wèn),則他的子節(jié)點(diǎn)也不能訪問(wèn)。

  使用帶CheckBox的數(shù)型結(jié)構(gòu)能得到很好的用戶體驗(yàn),可是編程的難度也是有點(diǎn)增加,如果全部有服務(wù)端來(lái)完成,那點(diǎn)下刷下,肯定不行,只能使用javascript,javascript調(diào)試的時(shí)候郁悶的很,一個(gè)字類,還有郁悶的遞歸,麻煩

  我以前是使用以下該方法

  <script

  language="javascript">

  //oncheck事件

  function

  tree_oncheck(tree)

  {

  var

  i;

  var

  node=tree.getTreeNode(tree.clickedNodeIndex);

  var

  Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");

  setcheck(node,Pchecked);

  setParent(node,Pchecked);

  //window.alert(Pchecked);

  document.all.checked.value

  if

  (tree.getChildren().length

  >

  0)

  {

  for

  (i=0;i<=tree.getChildren().length-1;i++)

  {

  if

  (tree.getChildren()[i].getAttribute("Checked"))

  {

  AddChecked(tree.getChildren()[i]);

  }

  FindCheckedFromNode(tree.getChildren()[i]);

  }

  }

  }

  //設(shè)置子節(jié)點(diǎn)選中

  function

  setcheck(node,Pchecked)

  {

  var

  i;

  var

  ChildNode=new

  Array();

  ChildNode=node.getChildren();

  if(parseInt(ChildNode.length)==0)

  {

  return;

  }

  else

  {

  for(i=0;i<ChildNode.length;i++)

  {

  var

  cNode;

  cNode=ChildNode[i];

  cNode.setAttribute("Checked",Pchecked);

  //cNode.Checked

  Pchecked;

  if(parseInt(cNode.getChildren().length)!=0)

  {

  setcheck(cNode,Pchecked);

  }

  }

  }

  }

  //設(shè)置子節(jié)點(diǎn)選中/取消;

  //同時(shí)需要設(shè)置父節(jié)點(diǎn)的狀態(tài)(如果是取消選中的話,僅僅設(shè)置本節(jié)點(diǎn)及其所有字接點(diǎn),不涉及父接點(diǎn))

  function

  setParent(node,Pc)

  {

  var

  parentNode

  node.getParent();

  if(parentNode)

  {

  var

  parentNodeFather

  parentNode.getParent();

  if(parentNodeFather)

  {

  setParent(parentNode,Pc);

  }

  if(Pc)

  {parentNode.setAttribute("checked",Pc);}

  else

  {

  checkBrother(parentNode,Pc,node.getAttribute("NodeData"))

  }

  }

  }

  //檢查子接點(diǎn)是否有選擇的,如果有一個(gè)選擇了,那返回true

  //只查第一級(jí)節(jié)點(diǎn).

  function

  checkBrother(parentNode,Pc,NodeData)

  {

  var

  childNodes

  new

  Array();

  childNodes

  parentNode.getChildren();

  if(childNodes.length

  >0)

  {

  var

  bChecked

  true;

  for(var

  i=0;i<childNodes.length;i++)

  {

  if(childNodes[i].getAttribute("checked")

  true

  &&

  childNodes[i].getAttribute("NodeData")

  NodeData)

  {

  //alert(i+childNodes[i].getAttribute("Text"));

  bChecked

  false;

  break;

  }

  }

  if(bChecked)

  {

  parentNode.setAttribute("checked",Pc);

  }

  else

  {

  //所有父結(jié)點(diǎn)選擇

  setParent(parentNode,!Pc)

  }

  }

  else

  {

  parentNode.setAttribute("checked",Pc);

  }

  }

  //獲取所有節(jié)點(diǎn)狀態(tài)

  function

  FindCheckedFromNode(node)

  {

  var

  i

  0;

  var

  nodes

  new

  Array();

  nodes

  node.getChildren();

  for

  (i

  0;

  i

  <=

  nodes.length

  1;

  i++)

  {

  if

  (nodes[i].getAttribute("Checked"))

  {

  AddChecked(nodes[i]);

  }

  if

  (parseInt(nodes[i].getChildren().length)

  {

  FindCheckedFromNode(nodes[i]);

  }

  }

  }

  //添加選中節(jié)點(diǎn)

  function

  AddChecked(node)

  {

  document.all.checked.value

  node.getAttribute("NodeData")

  }

  //-->

  這種方法有個(gè)很大的問(wèn)題,就是他客戶端設(shè)置的CheckBox在服務(wù)器端是不能獲取的,現(xiàn)在只能在Check的時(shí)候遍歷樹(shù),并把Checked的值放在一個(gè)文本里,然后提交到服務(wù)器,然后服務(wù)器來(lái)解析1@2@這種字符

  現(xiàn)在我使用的是asp.net2.0,使用的是以下的方法

  function

  public_GetParentByTagName(element,

  tagName)

  {

  var

  parent

  element.parentNode;

  var

  upperTagName

  tagName.toUpperCase();

  //如果這個(gè)元素還不是想要的tag就繼續(xù)上溯

  while

  (parent

  &&

  (parent.tagName.toUpperCase()

  upperTagName))

  {

  parent

  parent.parentNode

  parent.parentNode

  parent.parentElement;

  }

  return

  parent;

  }

  //設(shè)置節(jié)點(diǎn)的父節(jié)點(diǎn)Cheched——該節(jié)點(diǎn)可訪問(wèn),則他的父節(jié)點(diǎn)也必能訪問(wèn)

  function

  setParentChecked(objNode)

  {

  var

  objParentDiv

  public_GetParentByTagName(objNode,"div");

  if(objParentDiv==null

  objParentDiv

  "undefined")

  {

  return;

  }

  var

  objID

  objParentDiv.getAttribute("ID");

  objID

  objID.substring(0,objID.indexOf("Nodes"));

  objID

  objID+"CheckBox";

  var

  objParentCheckBox

  document.getElementById(objID);

  if(objParentCheckBox==null

  objParentCheckBox

  "undefined")

  {

  return;

  }

  if(objParentCheckBox.tagName!="INPUT"

  &&

  objParentCheckBox.type

  "checkbox")

  return;

  objParentCheckBox.checked

  true;

  setParentChecked(objParentCheckBox);

  }

  //設(shè)置節(jié)點(diǎn)的子節(jié)點(diǎn)uncheched——該節(jié)點(diǎn)不可訪問(wèn),則他的子節(jié)點(diǎn)也不能訪問(wèn)

  function

  setChildUnChecked(divID)

  {

  var

  objchild

  divID.children;

  var

  count

  objchild.length;

  for(var

  i=0;i<objchild.length;i++)

  {

  var

  tempObj

  objchild[i];

  if(tempObj.tagName=="INPUT"

  &&

  tempObj.type

  "checkbox")

  {

  tempObj.checked

  false;

  }

  setChildUnChecked(tempObj);

  }

  }

  //設(shè)置節(jié)點(diǎn)的子節(jié)點(diǎn)cheched——該節(jié)點(diǎn)可以訪問(wèn),則他的子節(jié)點(diǎn)也都能訪問(wèn)

  function

  setChildChecked(divID)

  {

  var

  objchild

  divID.children;

  var

  count

  objchild.length;

  for(var

  i=0;i<objchild.length;i++)

  {

  var

  tempObj

  objchild[i];

  if(tempObj.tagName=="INPUT"

  &&

  tempObj.type

  "checkbox")

  {

  tempObj.checked

  true;

  }

  setChildChecked(tempObj);

  }

  }

  //觸發(fā)事件

  function

  CheckEvent()

  {

  var

  objNode

  event.srcElement;

  if(objNode.tagName!="INPUT"

  objNode.type!="checkbox")

  return;

  if(objNode.checked==true)

  {

  setParentChecked(objNode);

  var

  objID

  objNode.getAttribute("ID");

  var

  objID

  objID.substring(0,objID.indexOf("CheckBox"));

  var

  objParentDiv

  document.getElementById(objID+"Nodes");

  if(objParentDiv==null

  objParentDiv

  "undefined")

  {

  return;

  }

  setChildChecked(objParentDiv);

  }

  else

  {

  var

  objID

  objNode.getAttribute("ID");

  var

  objID

  objID.substring(0,objID.indexOf("CheckBox"));

  var

  objParentDiv

  document.getElementById(objID+"Nodes");

  if(objParentDiv==null

  objParentDiv

  "undefined")

  {

  return;

  }

  setChildUnChecked(objParentDiv);

  }

  }這種方法最大的好處就是服務(wù)端能得javascript設(shè)置的Checked的值,不用沒(méi)點(diǎn)下就全部把樹(shù)遍利下,直接在服務(wù)端遍利一次就行了

  //遍歷子節(jié)點(diǎn)

  public

  void

  GetChildNode(TreeNode

  Node)

  {

  foreach

  (TreeNode

  node

  in

  Node.ChildNodes)

  {

  if

  (node.Checked)

  {

  StrChecked

  node.Value+"@";

  }

  GetChildNode(node);

  }

  }

  我照樣能得到它的Check的值

  ASP.NET 2.0中XML數(shù)據(jù)的處理

  SqlDataSource和ObjectDataSource控件都是平面表格式的數(shù)據(jù)源控件,操作也相對(duì)簡(jiǎn)單,在這里我就不細(xì)說(shuō)了.

  在這里我主要談下用于連接X(jué)ML文件的XmlDataSource和用于連接站點(diǎn)導(dǎo)航數(shù)據(jù)的SiteMapDataSource這兩個(gè)層次數(shù)據(jù)源控件中XmlDataSource數(shù)據(jù)綁定到平面表格控件的一起東東.

  XmlDataSource控件允許其它控件綁定到XML數(shù)據(jù)。XmlDataSource支持DataFile屬性,它被用于指定作為輸入(input)的XML數(shù)據(jù)文件的路徑。你還可以指定TranformFile屬性,給數(shù)據(jù)應(yīng)用XSLT轉(zhuǎn)換;設(shè)置XPath屬性來(lái)指定需要暴露的數(shù)據(jù)源節(jié)點(diǎn)的子集。

  <asp:XmlDataSource

  ID="myXmlDataSource"

  runat="server"

  DataFile="~/temp.xml"

  TransformFile="~transXml"

  XPath="//User">

  表格式數(shù)據(jù)綁定控件綁定到分層數(shù)據(jù)源也是可行的,但是它只能顯示第一層數(shù)據(jù)。在下面的demo中,Repeater控件綁定到

  temp.xml文件。由于數(shù)據(jù)源暴露的頂層節(jié)點(diǎn)是<User/>節(jié)點(diǎn),Repeater可以在自己的ItemTemplate模板中使用Eval數(shù)據(jù)綁定語(yǔ)法綁定到這些節(jié)點(diǎn)的屬性。

  <asp:Repeater

  runat="server"

  ID="myReater2"

  DataSourceID="myXmlDataSource">

  標(biāo)題

  姓名:<%#

  Eval("Name")

  %>

  Email:<%#

  Eval("Email")

  %>

  除了Eval數(shù)據(jù)綁定語(yǔ)法之外,ASP.NET

  2.0還提供了基于XPath的數(shù)據(jù)綁定語(yǔ)法,在實(shí)現(xiàn)了IXPathNavigable接口的任何數(shù)據(jù)項(xiàng)上都可以使用它。這里介紹兩種常用的表達(dá)式類型:

  XPath(expression,

  [formatString])

  根據(jù)數(shù)據(jù)項(xiàng)計(jì)算Xpath表達(dá)式的值,返回單個(gè)值。

  XPathSelect(expression,

  [formatString])

  根據(jù)數(shù)據(jù)項(xiàng)計(jì)算Xpath表達(dá)式的值,返回節(jié)點(diǎn)列表。

  下面我們來(lái)看看使用Xpath數(shù)據(jù)綁定方法的優(yōu)勢(shì),通過(guò)一個(gè)demo來(lái)說(shuō)明.

  Repeater的ItemTemplate模板另外增加了一個(gè)Repeater,并把這個(gè)內(nèi)部Repeater的屬性綁定到一個(gè)描述當(dāng)前User節(jié)點(diǎn)的Reply子節(jié)點(diǎn)的XPathSelect表達(dá)式。在內(nèi)部Repeater的ItemTemplate模板中,Xpath數(shù)據(jù)綁定表達(dá)式根據(jù)這些"Reply"內(nèi)容節(jié)點(diǎn)來(lái)計(jì)算值。ASP.NET

  2.0利用這種技術(shù),使你能夠通過(guò)組合表格式數(shù)據(jù)綁定控件簡(jiǎn)便地構(gòu)造出豐富的、分層的數(shù)據(jù)顯示方式。

  <asp:Repeater

  runat="server"

  ID="myRpeater"

  DataSourceID="myXmlDataSource">

  標(biāo)題

  ID:<%#

  XPath("@ID")

  %>

  姓名:

  

  Email:

  

  Content:

  

  <asp:Repeater

  runat="server"

  ID="childRepeater"

  DataSource='<%#

  XPathSelect("Reply")

  %>'>

  留言

  ReplyID:<%#XPath("ID")

  %>

  Time:<%#

  XPath("Time")

  %>

  Content:<%#

  XPath("Content")

  %>

  使用ASP.NET 2.0中的ReportViewer控件

  介紹

  任何數(shù)據(jù)驅(qū)動(dòng)型的應(yīng)用程序都有一個(gè)普遍的需求,那就是報(bào)表。

  但是,在ASP.NET

  1.x中并沒(méi)有給我們提供這個(gè)非常重要的特性。

  然而很幸運(yùn)的是,伴隨著。NET

  2.0而來(lái)的ReportViewer控件可以滿足你對(duì)報(bào)表的一些基本需求。

  我將會(huì)在本文中向你演示如何使用這個(gè)控件。

  ReportViewer控件既可以在web程序中使用,也可以在windows程序中使用。

  在這里,我將只介紹如何在web程序中使用它。

  報(bào)表示例

  我們假設(shè)要生成一個(gè)如下所示的顧客信息列表:

  上面的報(bào)表是一個(gè)非常簡(jiǎn)單的以國(guó)家分組的顧客信息列表。

  報(bào)表的數(shù)據(jù)是從Northwind數(shù)據(jù)庫(kù)的Customers表里獲取的。

  默認(rèn)情況下,它會(huì)顯示所有的顧客信息。

  但是,你也可以讓它顯示屬于你指定的某個(gè)國(guó)家的顧客信息。

  該報(bào)表是使用ReportViewer控件設(shè)計(jì)的,它可以從強(qiáng)類型的DataSet中或者自定義的對(duì)象集合中獲取數(shù)據(jù)。

  在實(shí)際的程序開(kāi)發(fā)中,我們往往會(huì)使用3層架構(gòu),數(shù)據(jù)的獲取經(jīng)常會(huì)是從業(yè)務(wù)層取得的DataSet或一個(gè)泛型集合。

  在這里,我打算使用一個(gè)泛型集合作為數(shù)據(jù)源,而不是強(qiáng)類型的DataSet.

  創(chuàng)建類庫(kù)

  首先,打開(kāi)Visual

  Studio,然后創(chuàng)建一個(gè)名為ReportViewerLib的類庫(kù)項(xiàng)目。

  添加一個(gè)如下所示的名為Customer的類:

  using

  System;using

  System.Data;using

  System.Configuration;using

  System.Data.SqlClient;using

  System.Collections.Generic;namespace

  ReportViewerLib{

  public

  class

  Customer

  {

  public

  string

  strCustomerID;

  public

  string

  strCompanyName;

  public

  string

  strContactName;

  public

  string

  strCountry;

  public

  string

  CustomerID

  {

  get

  {

  return

  strCustomerID;

  }

  set

  {

  strCustomerID

  value;

  }

  }

  public

  string

  CompanyName

  {

  get

  {

  return

  strCompanyName;

  }

  set

  {

  strCompanyName=

  value;

  }

  }

  public

  string

  ContactName

  {

  get

  {

  return

  strContactName;

  }

  set

  {

  strContactName=

  value;

  }

  }

  public

  string

  Country

  {

  get

  {

  return

  strCountry;

  }

  set

  {

  strCountry=

  value;

  }

  }

  public

  static

  List

  GetCustomersForCountry(string

  country)

  {

  SqlConnection

  cnn=new

  SqlConnection(

  ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);

  SqlCommand

  cmd=new

  SqlCommand();

  cmd.Connection=cnn;

  cmd.CommandText="select

  CustomerID,CompanyName,ContactName,Countryfrom

  customers

  where

  country=@country";

  SqlParameter

  p=new

  SqlParameter("@country",country);

  cmd.Parameters.Add(p);

  cnn.Open();

  SqlDataReader

  reader

  cmd.ExecuteReader();

  List

  list

  new

  List();

  while

  (reader.Read())

  {

  Customer

  c

  new

  Customer();

  c.CustomerID

  reader.GetString(0);

  c.CompanyName

  reader.GetString(1);

  c.ContactName

  reader.GetString(2);

  c.Country

  reader.GetString(3);

  list.Add(c);

  }

  cnn.Close();

  return

  list;

  }

  public

  static

  List

  GetAllCustomers()

  {

  SqlConnection

  cnn

  new

  SqlConnection(

  ConfigurationManager.ConnectionStrings

  ["NorthwindConnectionString"].ConnectionString);

  SqlCommand

  cmd

  new

  SqlCommand();

  cmd.Connection

  cnn;

  cmd.CommandText

  "select

  CustomerID,CompanyName,ContactName,Country

  from

  customers";

  cnn.Open();

  SqlDataReader

  reader

  cmd.ExecuteReader();

  List

  list

  new

  List();

  while

  (reader.Read())

  {

  Customer

  c

  new

  Customer();

  c.CustomerID

  reader.GetString(0);

  c.CompanyName

  reader.GetString(1);

  c.ContactName

  reader.GetString(2);

  c.Country

  reader.GetString(3);

  list.Add(c);

  }

  cnn.Close();

  return

  list;

  }

  }}

  123456下一頁(yè)

  GOvar

  pager=new

  iwmsPager(1,6,true);

  [新品]指紋私密 CECT超薄手寫(xiě)S10低價(jià)到貨! 01-08 -

  指紋手機(jī),這一新興的手機(jī)功能在CECT

  T100的強(qiáng)勢(shì)上市后被廣大機(jī)友所熟知并喜愛(ài)起來(lái),而借著這順風(fēng)順?biāo)娜藲,CECT又推出了一款指紋安全手機(jī)S10,它可以輕松實(shí)現(xiàn)六大指紋安全功能:指紋加密、指紋隱形、指紋防盜、指紋鼠標(biāo)、指紋撥號(hào)和指紋動(dòng)作。而CECT

  S10的整體表現(xiàn)會(huì)不會(huì)如T100一樣帶給我們無(wú)限驚喜呢?請(qǐng)機(jī)友們跟隨汀汀的文字一起去解一下吧,說(shuō)不定你會(huì)在瞬間選中它!

  作為熱賣機(jī)型CECT

  T100的升級(jí)版本,CECT

  S10在外形上略作修改,但更顯精練輕巧,商務(wù)氣息依然濃郁。而直板PDA手機(jī)風(fēng)格造型的S10三圍尺寸為113×54×11mm,做工精良,超薄的機(jī)身秀氣中不乏端莊。屏幕方面,CECT

  S10擁有一塊26萬(wàn)色的TFT屏幕,分辨率為目前主流的320*240像素QVGA分辨率,采用觸摸式設(shè)計(jì),支持手寫(xiě)、鍵盤(pán)雙輸入方式,并支持大字體撥號(hào)。

  娛樂(lè)方面,CECT

  S10具有實(shí)時(shí)流媒體播放,MP3和MP4播放器,錄音機(jī)、卡拉OK等功能,而內(nèi)置的任天堂游戲模擬器,附送游戲高達(dá)2000個(gè)。在攝像頭方面,S10內(nèi)置130萬(wàn)像素CMOS攝像頭,最大支持640*460分辨率的照片拍攝,支持?jǐn)?shù)碼變焦、三種照片質(zhì)量等拍攝模式,并支持有聲視頻拍攝!此外,CECT

  S10還能方便上網(wǎng)和收發(fā)電子郵件,內(nèi)置資訊時(shí)空包括SMS、MMS、IVR、WAP四大類約160個(gè)應(yīng)用。同時(shí),S10還支持大容量T-FLASH擴(kuò)展存儲(chǔ)卡,并可做U盤(pán)使用。

  強(qiáng)大的指紋識(shí)別和保密功能是CECT

  S10的突出特色,它通過(guò)指紋加密、指紋隱形、指紋防盜、指紋鼠標(biāo)、指紋撥號(hào)和指紋動(dòng)作這些功能巧妙地把私密信息保護(hù)、通信信息隱藏、通信人身份隱藏與快捷操作方式相結(jié)合,使用起來(lái)不僅令人放心而且舒心,不會(huì)擔(dān)心因不慎導(dǎo)致的個(gè)人信息泄露。另外,S10的電話簿容量為1000個(gè),可以多種方式進(jìn)行索引,支持群組功能,短信息容量高達(dá)400條,足以保留足夠多的個(gè)人短息和商務(wù)短信。

  縱觀CECT

  S10的整體表現(xiàn),它的主要賣點(diǎn)是集中在QVGA分辨率的26萬(wàn)色TFT屏幕、支持手寫(xiě)鍵盤(pán)雙輸入、娛樂(lè)游戲擴(kuò)展功能以及最為可圈可點(diǎn)的指紋識(shí)別和保密功能。而以上的這些賣點(diǎn)再配以目前北斗手機(jī)網(wǎng)699元的售價(jià)就更是劃算至極了,喜歡的機(jī)友沒(méi)有理由不選它哦!

  [新品]拍照新旗艦 500W索愛(ài)K858c盛情上市! 01-08 -

  拍照手機(jī)的迅猛發(fā)展是時(shí)代大環(huán)境所需,同時(shí)也出乎了很多人的意料!如今200萬(wàn)像素已經(jīng)成為了新機(jī)上市的家常便飯,320萬(wàn)像素可以和主流手機(jī)貼貼邊,500萬(wàn)像素才是真正的大勢(shì)所趨!在看過(guò)了其它廠家的500W像素新機(jī)上市后,索尼愛(ài)立信Cyber-shot品牌下的拍照悍將K858c也終于閃亮登場(chǎng)了,歡迎已經(jīng)迫不急待想熟知它一切功能的機(jī)友和汀汀一起對(duì)K858c來(lái)個(gè)從頭至尾的了解,它的強(qiáng)大功能定會(huì)令你不由自主的傾心于它!

  索愛(ài)K858c采用索愛(ài)最拿手的直板式造型設(shè)計(jì),機(jī)身線條筆直硬朗,酷勁十足,尤其是采用黑色為主色調(diào)更增強(qiáng)了它的視覺(jué)沖擊力。在色彩搭配選擇上,除了經(jīng)典的黑色外,K858c的功能鍵、鏡頭部分和LOGO標(biāo)簽都是采用銀色點(diǎn)綴,再配上眩目的綠色方向?qū)Ш芥I和機(jī)身周邊裝飾條,非常惹眼。屏幕方面,K858c采用了一塊2.2英寸的26萬(wàn)色TFT顯示屏幕,分辨率達(dá)到了QVGA級(jí)別(240×320像素)。依照索尼愛(ài)立信公司的一貫作風(fēng),K858c的屏幕顯示非常優(yōu)秀,畫(huà)面細(xì)膩度和文字銳度表現(xiàn)得近乎完美。

  索愛(ài)K858c的背面設(shè)計(jì)融入了相機(jī)血統(tǒng),采用雙面卡片DC設(shè)計(jì)原則,所配備的500萬(wàn)像素鏡頭支持自動(dòng)對(duì)焦、氙氣閃光燈、16倍數(shù)碼變焦等豐富影像功能,完全采用Cyber-shot數(shù)碼相機(jī)的操作界面,影像菜單比以往更加直觀,DC感更加強(qiáng)烈。另外,Best

  Pic、Photo

  fix等優(yōu)化軟件的運(yùn)用也令照片趨于完美。

  索愛(ài)K858c內(nèi)置MP3播放器具備WALKMAN獨(dú)有的Mega

  Bass音效,支持藍(lán)牙2.0,A2DP標(biāo)準(zhǔn),配合高質(zhì)量藍(lán)牙立體聲耳機(jī),效果震憾。此外,K858c除了擁有40MB機(jī)身內(nèi)存外,還創(chuàng)造了一個(gè)行業(yè)第一,它不僅支持M2卡,同時(shí)還支持Micro

  SD卡的擴(kuò)展,而且兩個(gè)存儲(chǔ)卡的擴(kuò)展都使用一個(gè)插槽,不同的只是插卡的方向。

  這一場(chǎng)由索愛(ài)K858c所引爆的拍照風(fēng)潮正向我們襲來(lái),它的整體表現(xiàn)足以成為拍照手機(jī)領(lǐng)域里的新旗艦,并有能力與其它各大品牌的500萬(wàn)像素手機(jī)相抗衡!北斗手機(jī)網(wǎng)4280元的上市售價(jià)也算厚道,歡迎有實(shí)力嘗鮮的機(jī)友們先用為快,來(lái)體驗(yàn)一下K858c所釋放出來(lái)無(wú)窮魅力!

【ASP.NET 2.0 中跨網(wǎng)頁(yè)提交的方法有哪三種】相關(guān)文章:

javascript跨域訪問(wèn)的方法07-09

拉丁舞高低跨部有哪些訓(xùn)練方法?06-03

納稅籌劃應(yīng)具備哪三種意識(shí)08-03

鋼琴的三種彈奏方法06-17

JavaScript中的三種對(duì)象10-24

網(wǎng)球的三種握拍方法12-14

java中File類有哪些使用方法06-30

聲樂(lè)藝術(shù)中的三種唱法06-29

三種思科認(rèn)證學(xué)習(xí)方法07-17

家庭常用三種保存茶葉的方法09-25