仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 527|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计ASP.NET教程:汇总前台代码绑定背景变量...

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:19:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。</p>常常会碰着在前台代码中要利用(或绑定)背景代码中变量值的成绩。一样平常有<%=str%>和<%#str%>两种体例,这里复杂总结一下。若有毛病或贰言的地方,敬请列位指教。
一方面,这里所讲的前台即一般的.aspx文件,背景指的是与aspx相干联的CodeBehind,文件后缀名为.aspx.cs;另外一方面,这里的绑定是指用户收回会见某一页面指令后,服务器端在实行过程当中就已将前台代码举行了赋值,尔后天生html格局回传客户端显现,而并不是已显现到客户端后,然后经由过程其他办法(如ajax)往服务器端猎取响应变量。
备注:下面说的两个文件是罕见的代码埋没(code-behind)形式,另有一种是代码嵌进(code-beside,inline)形式,那就是只存在aspx一个文件,尔后台代码则写进此文件的<scripttype="text/javascript"runat="server"></script>当中(另有一些语法上区分),这关于本文会商的成绩略有影响,由于代码嵌进是声明性代码与C#/VB.NET代码都一同编译到一个类内里,而代码埋没则将声明性代码与C#/VB.NET代码分隔几回举行翻译/编译,因而前者是部分与部分(partial)的干系后者基类与派生类的干系,但这仅仅影响所能绑定变量的局限(与润色符有关),上面会提到。以下均以代码埋没形式为例。
一样平常来讲,在前台代码的三种地位大概会用到(绑定)背景变量:
服务器端控件属性或HTML标签属性
JavaScript代码中
Html显现内容的地位(也就是入手下手标签与停止标签之间的内容,如<div>这里</div>(Html标签)大概<asp:LabelID="Label2"runat="server"Text="Label">这里</asp:Label>(服务器端控件),它作为占位符把变量显现于标记呈现的地位)
关于第一种地位,有一些束缚前提:
(1)一样平常的属性请求是字符串型或数值型(上面会提到有些服务器端属性撑持属性为数据汇合);
(2)并非一切的属性都能够绑定变量,有些属性比方runat属性必需是"server"常量,即便绑定的字符串是server,也会招致剖析器剖析时堕落;
(3)有一种属性,他请求属性值有束缚(范例束缚,好比服务器端控件请求TabIndex属性是short范例,大概字符串内容有束缚),也应当在绑准时满意,不然仍然大概编译时报错;
(4)还一种属性,固然属性自己有束缚,但即便绑定的变量不满意束缚,也能够编译经由过程,好比input的checked属性,它只要checked字符串是正当的,但假如经由过程绑定猎取到的字符串不是checked,那末这些属性将有本人外部处置机制,来包管能够一般利用;
(5)还要注重,即便关于统一类属性,服务器端和HTML的属性的处置机制也分歧,一样是TabIndex(tabIndex),前者假如不满意,则剖析器毛病,后者则疏忽这一成绩。
关于第二种地位,一样平常只需绑定的背景变量和JavaScript中数据范例兼容便可。
关于第三种地位,假如绑定呈现的地位不在服务器端控件外部,则没有束缚前提,只需是常量字符串能够呈现的地位,都可以绑定。可是关于置于服务器端控件外部,也就是下面那种<asp:LabelID="Label2"runat="server"Text="Label">这里</asp:Label>的体例,则有束缚前提。经由过程总结,归结为四类服务器端控件,假如绑定的代码呈现在这些控件的入手下手和停止标签之间(这里所说的控件,是指假如绑定代码外有多层的嵌套控件包抄,则是指包抄绑定代码的最内层控件),有分歧的显现了局:
(1)束缚型控件:这类控件请求它的入手下手标签和停止标签中只能包括指定的子控件,因而假如在这里呈现代码块,将编译毛病。比方:
<asp:DataListrunat="server"></asp:DataList>,在它之间,请求必需嵌套<ItemTemplate></ItemTemplate>。
(2)非嵌套类控件:这类控件,不同意在外部嵌套其他控件或标签,只能是常量字符串,它会将入手下手标签和停止标签中常量字符串内容作为他的属性。比方下面提到的TextBox,它会将标签间内容作为它的Text属性值。
(3)嵌套类控件:这类控件,能够嵌套其他恣意控件,也能够包括字符串,因而能够一般显现绑定代码块所暗示的字符串内容。比方Label控件、Panel等。
(4)数据绑定类控件:这类控件是ASP.NET供应的服务器端控件,除能够绑定一般的变量范例,也能够绑定一个数据汇合(只能接纳上面的第二种体例完成)。
关因而否加引号:在以上三个地位利用时,是不是应当将<%=str%>或<%#str%>置于单引号或双引号中呢?关于在分歧地位,处置的体例是分歧的:(详细请鄙人面两种体例的详细先容时,加以体味)
(1)关于第一种地位,因为JavaScript是弱范例的,假如绑准时加引号,明显就以为就当作字符串来处置,这一直是准确的;假如绑准时不加引号,它将以为这是个数值型的,那末假如猎取的真是数值,固然能够,假如长短数值型,则将发生剧本毛病,这即便关于JavaScript赋值常量时,也是一样的:
以下为援用的内容:
vartest1=123b;//运转时报错
vartest2=123;//准确,是数值型
vartest3="123b";//准确,字符串型


(2)关于第二种地位,经由测试,不管是关于服务器端控件属性仍是HTML标签属性,加引号老是准确的;假如不加引号,则两种属性的处置体例分歧:
关于服务器端控件属性,假如绑定的代码块不加引号,则编译时会提醒“考证(ASP.NET):特征值前后必需加引号”的告诫信息,可是天生为HTML后,对应天生的HTML属性已被加上引号并猎取了准确的绑定了局,因而加不加引号不会影响利用,可是倡议关于标准的代码,仍是加上为好;
关于HTML标签属性,假如不加引号,则编译时会提醒“考证(XHTML1.0Transitional):特征值前后必需加引号”的告诫信息,而且天生为HTML属性也的确没有加上引号,那末固然属性前面的确是没有加上引号的准确的绑定值,可是纷歧定能展现出想要看到的了局。好比关于input标签的value属性,假如绑定的字符串是"helloworldfromvariable”,则在客户真个input显现出的内容实践上只是"hello”字符串,失效的属性值是一个被截断的字符串,它附属性后的一串字符串(若未加引号)的第一个非空字符入手下手,停止到下一个空字符的前一个字符为止(好比关于"helloworld”,了局将是"hello”),因而,加上引号是必需的。
(3)关于第三种地位,加与不加引号,猎取的值及其显现均不受影响。
因而倡议,一切绑定表达式都加上引号,作为字符串猎取,然后依据实践需求,用响应函数举行转换,失掉所必要的范例。
别的,这里所说的背景变量是泛指的,包含以下:
成员变量
办法或属性的前往值
表达式,也就是一切背景可以实行的代码,运转后所失掉的值(也就是间接将背景代码写在前台代码中,记得利用完整限制名或在背景中using相干namespace)
数据汇合
背景变量有一些束缚前提,必要满意:
(1)变量润色符请求。变量是静态大概实例字段都可。关于代码埋没形式的ASP.NET,以上的所述的变量必需为public或protected范例(由于是基类与派生类的干系),private大概internal都不可,而代码嵌进形式则任何润色符的变量都可会见(一个类外部的干系)。
(2)变量范例请求。因为前台属性通常为字符串范例,而JavaScript基础范例也就是字符串型、数字型、布尔型,因而对应的变量应当也是这几种体例,其他范例假如不被撑持(如庞大范例、数组、援用范例等),前台猎取的就是挪用了变量的ToString()办法所失掉的字符串。因而,在绑准时,要依据情形看是不是能举行隐式范例转换,需要时还要用相干函数来强迫转换,以包管前台能够取得准确的值。固然,关于数据绑定类控件,它的有些属性能够为数据汇合,但这时候的绑定只能经由过程上面第二种体例才被撑持。
以上是一些观点和基础束缚,这些都是两种体例都应当满意的,上面详细先容两种体例,来完成前台代码中(以下称为代码块)绑定背景变量的功效。
一.<%=str%>
此种体例实际上是ASP时期就撑持的,ASP经由过程包括在<%和%>中的表达式将实行了局输入到客户扫瞄器,如:<%=test%>就是将变量test的值发送到客户扫瞄器中。在ASP.NET中,这个表达式仍然可使用,并能够呈现在前台代码的上述三个地位,可是要注重,除上述的一样平常性束缚外,关于控件属性,还必需是绑定到非服务器端控件的属性。别的,它只能绑定下面讲的前三种变量范例,不撑持绑定命据汇合。例子以下:
背景代码:
以下为援用的内容:
publicpartialclassWebForm2:System.Web.UI.Page
{
publicstringGetVariableStr;//注重变量的润色符
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
GetVariableStr="helloworldfromvariable";
}
}
protectedstringGetFunctionStr()//注重前往值的润色符
{
return"helloworldfromFunction";
}
}

前台代码:
以下为援用的内容:
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<scripttype="text/javascript">
functionfun(){
varstr=<%=DateTime.Now%>;
//前台地位1,绑定的是第三种变量范例(也是第二种体例,?由于Now是个属性)
alert(str);
}
</script>
</head>
<bodyonload="fun()">
<formid="form1"runat="server">
<div>
<inputtype="text"value="<%=GetVariableStr%>"/>
<%--前台地位2,绑定的是成员变量--%>
"<%=GetFunctionStr()%>"
<%--前台地位3,绑定的是一个办法的前往值>--%>
</div>
</form>
</body>
</html>

一些毛病的利用:
之以是说第一种绑定体例要用于非服务器端控件的属性,是由于假如使用于这些服务器端属性时,这些代码实践上不被剖析。好比:
以下为援用的内容:
<asp:LabelID="Label1"runat="server"Text="<%=GetVariableStr%>"></asp:Label>
<asp:TextBoxID="TextBox1"runat="server"Text="<%=GetVariableStr%>"></asp:TextBox>

则显现出来的Label1的文本是空,而TextBox中文本是"<%=GetVariableStr%>”,以是记着,对服务器端控件的属性加如许的代码块,将不被剖析,而是将这一字符串间接作为属性值了,以是不是想要的了局。假如引号也不加上,将会编译毛病,提醒“服务器标志不克不及包括<%...%>机关。”。
这里分离开篇提到的关于将绑定代码快置于“Html显现内容的地位”时,假如在服务器端控件内,那四类控件怎样显现的成绩。以下:

以下为援用的内容:
<asp:LabelID="Label1"runat="server">"<%=GetVariableStr%>"</asp:Label>
<asp:TextBoxID="TextBox1"runat="server">"<%=GetVariableStr%>"</asp:TextBox>

个中,Label1属于嵌套类控件,Label1的确显现了准确的了局,TextBox属于非嵌套类控件,TextBox假如用这类体例,将会发生编译毛病,提醒“此高低文中不撑持代码块。”
二.<%#str%>
ASP.NET引进了一种新的声明语法<%#%>。该语法是在.aspx页中利用数据绑定的基本,一切数据绑定表达式都必需包括在这些字符中。这里从用法和合用局限等方面与第一种绑定体例举行辨别。
从呈现的地位来看,除能呈现在第一种代码块呈现的一切地位外,他还能够呈现在服务器端控件的属性中。
从绑定的变量范例上看,他还能够共同ASP.NET的数据绑定类控件,来绑定上述的第四种“变量”范例,就是数据汇合(DropDownList,DataList,DataGrid,ListBox这些是数据绑定类控件,数据汇合包含ArrayList(数组),Hashtable(哈稀表,DataView(数据视图),DataReader等)。
从用法上看,在前台代码中除在响应地位写上<%#%>外,在背景代码中,还必要利用DataBind()办法。以下是实例:
前台代码:
以下为援用的内容:
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<scripttype="text/javascript">
functionfun(){
varstr=<%#DateTime.Now%>;
alert(str);
}
</script>
</head>
<bodyonload="fun()">
<formid="form1"runat="server">
<div>
<inputtype="text"value="<%#GetVariableStr%>"/><br/>
"<%#GetVariableStr%>"
<asp:LabelID="Label1"runat="server"Text="<%#GetVariableStr%>"></asp:Label>
<%--此种体例能够绑定服务器端控件的属性--%>
<asp:DropDownListID="DropDownList1"runat="server"DataSource=<%#arraylist%>>
<%--将汇合绑定到数据绑定类控件,经由过程DataSource属性来完成,从而鄙人拉框看到汇合中的内容--%>
</asp:DropDownList>
<asp:DataListID="DataList1"runat="server"DataSource=<%#dt%>>
<%--同上,绑定了DataTable数据汇合?--%>
<ItemTemplate>
<tableborder="1"cellpadding="0"cellspacing="0">
<tr>
<td>
<asp:LabelID="Label2"runat="server"Text=<%#Bind("row0")%>></asp:Label>
<%--因为绑定的数据汇合具有多列,而且此数据绑定类控件撑持模板,
因而必要在模板中指定必要绑定的列和格局--%>
</td>
<td>
<%#Eval("row1")%>
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
</div>
</form>
</body>
</html>

能够看出,这类体例在利用时,不仅能够完成(代替)<%=...%>所满意的功效,还能够绑定服务器控件属性(如下面的Label1),也能够将汇合范例绑定到撑持的数据绑定类控件。在用法上,前台代码除对数据绑定类控件绑定命据汇合外有所不同,其他的利用上与第一种没区分。在绑定类控件的模板中,怎样利用Eval、Bind、DataBinder.Eval等,不在此文会商中,能够参考上面链接的参考文章。
背景代码:
以下为援用的内容:
publicpartialclassWebForm2:System.Web.UI.Page
{
publicstringGetVariableStr;
publicArrayListarraylist;
publicDataTabledt;
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
GetVariableStr="helloworldfromvariable";
arraylist=newArrayList();
arraylist.Add("选?项?1");
arraylist.Add("选?项?2");
dt=newDataTable();
dt.Columns.Add("row0");
dt.Columns.Add("row1");
DataRowdr1=dt.NewRow();
dr1[0]="1.1";
dr1[1]="1.2";
DataRowdr2=dt.NewRow();
dr2[0]="2.1";
dr2[1]="2.2";
dt.Rows.Add(dr1);
dt.Rows.Add(dr2);
Page.DataBind();
//DropDownList1.DataBind();
//DataList1.DataBind();
}
}
}

在背景代码中,与第一种体例独一分歧的,就是必要挪用DataBind办法。只要实行了响应控件的DataBind办法,前台代码中这些控件中利用<%#%>的绑定才会产生(而且控件外部的一切绑定也会产生,好比又嵌套了一个绑定背景数据的控件),不然得话将不会被赋值,而是默许空值。下面我们用的是Page的DataBind办法,那末全部页面一切绑建都会实行。固然,假如我们只实行DataList1大概DropDownList1的DataBind办法,那末只要响应控件的绑定才会产生。必要注重的是,这里说的必要实行DataBind包含了显现和隐式实行,有些数据绑定类控件,当它们经由过程DataSourceID属性绑定到数据源控件时,会经由过程隐式挪用DataBind办法来实行绑定。这时候就不用显现的再次挪用了。
二者区分:
两种绑定体例上,他们的束缚基础不异,都请求与属性婚配,呈现在他们能够呈现的地位。后者的利用地位更普遍,特别是撑持服务器端控件和绑定命据汇合。背景代码方面,后者必要挪用DataBind才干完成绑定,前者则没有这方面请求。这里次要区分一下二者在实行机制上的区分:<%=...%>是在程序实行时挪用(应当是在页面的RenderControl事务过程当中完成的,也就是一般情形下我们能够看到的背景代码都实行终了后再往到前台代码中举行赋值绑定),而<%#...%>是在DataBind()办法以后被挪用,一旦挪用了DataBind(),则它对应的控件将绑定变量,因而,请注重:假如在DataBind()后再修正变量,那末绑定的就不是最新值了,这就必要在完成变量的赋值后,再往DataBind()。实在这两种体例,它的运转历程能够在VS中经由过程设置断点来看看,看二者的绑定赋值分离是在甚么时分产生的。
尚存的疑问:
1.不晓得为何不克不及猎取到internal润色的变量?
出处:http://www.ckuyun.com/lerit/archive/2010/10/22/1858007.html
本文版权回作者和博客园共有,接待转载,但未经作者批准必需保存此段声明,且在文章页面分明地位给出原文毗连,不然保存究查功令义务的权力.
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-19 05:53:11 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
海妖 该用户已被删除
板凳
发表于 2015-1-24 07:48:15 | 只看该作者
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
老尸 该用户已被删除
地板
发表于 2015-1-31 22:17:08 | 只看该作者
可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。
变相怪杰 该用户已被删除
5#
发表于 2015-2-7 00:34:31 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
第二个灵魂 该用户已被删除
6#
发表于 2015-2-19 05:02:14 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
分手快乐 该用户已被删除
7#
发表于 2015-3-6 13:19:47 | 只看该作者
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
简单生活 该用户已被删除
8#
发表于 2015-3-13 01:09:30 | 只看该作者
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
谁可相欹 该用户已被删除
9#
发表于 2015-3-20 09:15:56 | 只看该作者
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-22 07:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表