不帅 发表于 2015-1-16 22:49:18

ASP.NET教程之Asp.net下的工具成员数据绑定器完成

中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。asp.net|工具|数据用过MonoRail的伴侣应当晓得它供应的工具成员数据绑定功效十分便利,经由过程标志参数属性或办法就能够主动把提交返来的数据和工具成员举行绑定;有了这些便利的功效切实其实能够节俭大批的set代码。不外这些功效只是MonoRail供应,因而完成相似的功效便利本人开辟。
  完成方针:能够天真便利地完成数据绑定。
  OrderSearchsearch=FormContext.BindObject<OrderSearch>();
  Ordersorder=FormContext.BindObject<Orders>("order");
  制订划定规矩和束缚
  起首断定WEB提交的数据和成员属性的映照干系,能够经由过程称号商定的体例:
  <inputid="Text1"name="companyname"type="text"/>
  xxxx.LastName、xxxx_LastName或xxxxLastName等。在绑历程能够指定前缀举行工具成员的绑定;不外在webForm控件的Name是asp.net天生的,在干系剖析上就绝对庞大些。
  范例转换接口的界说
  由于转换的情形是很难断定;除。NET的基本范例外实践使用中还会存在其他转换体例,如:HttpPostedFile到byte[],序列化String到Object等。因而制订转换接口就能够便利完成可扩大和可设置。
publicinterfaceIStringConverter
{
objectConvertTo(stringvalue,outboolsucceeded);
}
  因为Web供应的数据年夜部分是以string的体例供应,因而界说一个基于string转换形貌。基于接口的实也很复杂:
publicclassToSbyte:IStringConverter
{
#regionIStringConverter成员
objectIStringConverter.ConvertTo(stringvalue,outboolsucceeded)
{
sbytenvalue;
succeeded=sbyte.TryParse(value,outnvalue);
returnnvalue;
}
#endregion
}
  IStringConverter工场的完成
  因为转换情形的不断定性,因而经由过程工场的体例来到达代码对外的关闭性和优秀的扩大性。能够经由过程方针范例来猎取相干转换实例,在.NET中IDictionary就可以够到达使用的请求。
staticIDictionary<Type,IStringConverter>mConverters;
publicstaticIDictionary<Type,IStringConverter>Converters
{
get
{
if(mConverters==null)
{
lock(typeof(ConverterFactory))
{
OnInit();
}
}
returnmConverters;
}
}
staticvoidOnInit()
{
if(mConverters!=null)
return;
mConverters=newDictionary<Type,IStringConverter>();
mConverters.Add(typeof(byte),newToByte());
LoadConfig();
}
//从设置文件加载转换器映照,假如设置存在不异范例转器就代替原有转换器
staticvoidLoadConfig()
{
//LoadConfig
//<convertertype="System.Int32",value="HFSoft.Binder.ToByte"
}
为了便利利用能够在工场中硬编码设置外部基本范例;由于转换情形的不断定,以是同意经由过程设置文件的体例引进分歧情形的范例转换器。
能够扩大性的CustomAttribute
  固然工场能够到达转换接口的可设置性,但实践上很难到达使用请求;在某些情形下范例转换器只是在某些工具成员中无效(固然设置文件也能够到达期请求,但在设置文件中界说这么小的粒度并非好的选择);经由过程Attribute给相干Property指定范例转换器十分合适。
///<summary>
///用于特别情形下形貌工具详细成员的转换器
///</summary>

publicclassConverterAttribute:Attribute,IStringConverter
{
publicConverterAttribute(Typeconvertertype)
{
mConverterType=convertertype;
}
publicConverterAttribute(Typeconvertertype,stringdefvalue)
{
mConverterType=convertertype;
mDefaultValue=defvalue;
}
privateTypemConverterType;
publicTypeConverterType
{
get
{
returnmConverterType;
}
}
privateStringmDefaultValue;
publicStringDefaultValue
{
get
{
returnmDefaultValue;
}
set
{
mDefaultValue=value;
}
}
protectedIStringConverterCreateInstance()
{
if(mConverters.ContainsKey(ConverterType))
returnmConverters;
lock(typeof(ConverterAttribute))
{
if(!mConverters.ContainsKey(ConverterType))
{
mConverters.Add(ConverterType,(IStringConverter)Activator.CreateInstance(ConverterType));
}
returnmConverters;
}
}
staticIDictionary<Type,IStringConverter>mConverters=newDictionary<Type,IStringConverter>();
#regionIStringConverter成员
publicobjectConvertTo(stringvalue,outboolsucceeded)
{
stringnewvalue=value!=null?value:DefaultValue;
returnCreateInstance().ConvertTo(newvalue,outsucceeded);
}
#endregion
}
经由过程ConverterAttribute能够便利制订粒度更小的设置
privatebyte[]mFileStream;

publicbyte[]FileStream
{
get
{
returnmFileStream;
}
set
{
mFileStream=value;
}
}
以上界说能够上传文件流转成byte[]到FileStream属性中。
功效集成完成
如今就把一切器材集成起来,满意目标的请求。
publicobjectBind(System.Collections.Specialized.NameValueCollectionvalues,stringprefix)
{
objectnewobj=Activator.CreateInstance(ObjectType);
if(prefix==null)
prefix="";
objectvalue;
foreach(PropertyInfoiteminProperties)
{
value=values;
if(value==null)
value=values;
if(value==null)
value=values;
BindProperty(newobj,item,(string)value);
}
returnnewobj;
}
privatevoidBindProperty(objectobj,PropertyInfoproperty,stringvalue)
{
IStringConverterstringconver;
objectnvalue;
boolconfirm=false;
Object[]cas=property.GetCustomAttributes(typeof(ConverterAttribute),true);
if(cas.Length>0)
{
nvalue=((ConverterAttribute)cas).ConvertTo(value,outconfirm);
if(confirm)
mPropertiesHandle.SetValue(obj,nvalue);
}
else
{
if(ConverterFactory.Converters.ContainsKey(property.PropertyType))
{
stringconver=ConverterFactory.Converters;
nvalue=stringconver.ConvertTo(value,outconfirm);
if(confirm)
mPropertiesHandle.SetValue(obj,nvalue);
}
}
}
  由于Web提交的数据几近能够经由过程HttpRequest.Params失掉,只必要依据属性称号和相干前缀举行婚配查找就能够了。这里完成的婚配体例其实不幻想,实在能够在相干page第一次哀求就能够剖析到干系存在IDictionary中,前期间接利用就能够了。
  以上功效是在编写一个MVC组件的数据绑定功效,实在完整能够移植传统的WebForm下事情;有更好设法的伴侣请多提交定见。
我见过java运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《Java的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。

admin 发表于 2015-1-17 12:35:12

我的意思是.net好用,从功能上来说比JAVA强还是很明显的。

山那边是海 发表于 2015-1-20 18:02:38

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

谁可相欹 发表于 2015-1-29 13:51:32

虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。

柔情似水 发表于 2015-2-14 20:55:47

关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。

灵魂腐蚀 发表于 2015-3-4 10:29:59

使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。

透明 发表于 2015-3-11 18:17:17

平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。

精灵巫婆 发表于 2015-3-19 06:44:49

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

第二个灵魂 发表于 2015-3-27 11:08:37

能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。
页: [1]
查看完整版本: ASP.NET教程之Asp.net下的工具成员数据绑定器完成