原価プロジェクト 知識
1.String与string的区别
string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色)
c# string映射为.net Framework的String
如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作
如果使用c#,建议使用string,比较符合规范
string始终代表 System.String(1.x) 或 ::System.String(2.0) ,String只有在前面有using System;的时候并且当前命名空间中没有名为String的类型(class、struct、delegate、enum)的时候才代表System.String
string是关键字,String不是,也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以。
2.Convert.ToInt32(); 与Int32.Parse的区别
Convert.ToInt32()与int.Parse()的区别(1)这两个方法的最大不同是它们对null值的处理方法:
Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常。
2)还有一点区别就是
a. Convert.ToInt32(double value)
如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5转换为4,4.5 转换为 4,而 5.5 转换为 6。 不过4.6可以转换为5,4.4转换为4
b. int.Parse("4.5")
直接报错:"输入字符串的格式不正确".
c. int(4.6) = 4
Int转化其他数值类型为Int时没有四舍五入,强制转换
int.Parse是转换String为int
Convert.ToInt32是转换继承自Object的对象为int的.
你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32.
个人总结:
(1)Convert.ToInt32的参数比较多,Int.Parse只能转换string类型的.
(2)Parse就是把String转换成int,char,double....等,也就是*.Parse(string) 括号中的一定要是string.
(3)Convert可以提供多种类型的转换,也就是Convert.*()括号中可以为很多种类型(包括string).
2. Subst命令的使用
Subst是DOS下的一个优秀的命令,它的可执行文件Subst.exe在C:\Windows\system32文件夹下(此路径指windows xp系统),其正规的中文名称应该是“给目录赋驱动器符命令”。它的功能是以磁盘驱动器符代替路径名称,以使驱动器符与指定的子目录路径等效。
其命令格式很简单:Subst Drive1 Drive2 Path ,
subst R: "C:\LiuProject\GenKaRun"
其中“Drive1”是指定替代磁盘路径的虚拟的新驱动器符,“Drive2 Path”是指定所要替代的文件夹及其路径。
用户可以利用它将任意目录虚拟成一个磁盘驱动器,如果用户需要删除虚拟的盘符,可以执行Subst Drive1 /D命令。同时,并非所有的程序都可以正确使用Subst命令所生成的驱动器符,比如Format、Sys、Fdisk等一些如今还常用的命令,这些命令必须使用真实的驱动器,它们拒绝对Subst虚拟的驱动器进行操作。对于网络磁盘驱动器,Subst命令也是无能为力的。
在dos命令提示符下执行subst命令虚拟增加的盘符,重启电脑或者注销电脑后,虚拟增加的盘符会消失,如果重启电脑或者注销电脑后盘符不消失,可以编辑批处理放在启动脚本里即可。网上说的是编辑系统根目录下的AUTOEXEC.BAT文件,在我的电脑上试过了,不行的,也许与另有原因吧。
高级使用技巧
初步了解了Subst命令的用途及用法,不妨再看看它的一些高级使用技巧:
1.隐藏驱动器Subst的看家本领是虚拟磁盘驱动器符,虽然微软建议用户采用没有使用的盘符进行虚拟,但并不表示它不能虚拟已经存在的盘符,比如A盘、C盘等。于是用户可以通过Subst命令虚拟A、C等盘符,直接覆盖这些已经存在的盘符,使他人无法看到该盘的真正内容,以达到隐藏真实驱动器的目的。例如,用户先在D盘根目录下创建一个名为“Aaa”的文件夹,最好将文件夹的属性设置为“只读”和“隐藏”。然后在C盘根目录下打开“Autoexec.bat”文件,加入以下代码:@Echo Off C \Windows\system32\Subst A D \Aaa这样每次在系统启动后软盘的图标就变为硬盘的样子,其中的内容也变了,从而实现偷梁换柱的目的。需要还原的时候,只需在MS-DOS方式下,运行“SubstA /D”就行了。
2.特殊软件的安装有少数软件在安装时会提示需要从A盘中提取安装信息,这时难道只有将文件拷贝到软盘后再安装吗?完全没有这个必要,Subst命令可以“欺骗”这些需要用软盘安装的软件。用户把软盘中的文件全部拷贝到硬盘上的任意文件夹中,再将该文件夹用Subst命令虚拟成A盘后,即可顺利安装。
3.模拟光盘自动运行目前大部分多媒体光盘都带有一个自动运行命令,方便了用户的使用。然而若将光盘上的所有内容全盘拷贝到硬盘上就不能正常运行。这时,用户可以将放置光盘内容的文件夹虚拟成光盘驱动器(Subst F D \Guangpan,假设F 为光驱),则软件能正常运行。
3. ASP.NET UseSubmitBehavior 属性
如果该控件使用了客户端浏览器的提交机制,则为 true;否则为 false。默认值为 true。
当 UseSubmitBehavior 属性为 false 时,控件开发人员可以使用 GetPostBackEventReference 方法来返回 Button 的客户端回发事件。GetPostBackEventReference 方法返回的字符串包含客户端函数调用的文本,可以插入到客户端事件处理程序中。
4.Button控件的onclick、oncommand、commandname、CommandArgument的区别
5.关闭子窗口刷新父窗口,并且走进!IsPostBack
用window.open()打开子窗口时,刷新父窗口
window.opener.location.href=window.opener.location.href;
window.close();
window.showModalDialog和window.open关闭子页面时刷新父页面
父窗体打开页面的javascript
function GoToPage(id)
{
var title="title";
var url="xxxxx.aspx?ID="+id+"&Radom="+Math.random();;
var Width="700";
var Height="600";
var arguemnts = new Object();
arguemnts.window = window;
if (document.all&&window.print)
{
window.showModalDialog(url,arguemnts,"dialogWidth:" + Width + "px;dialogHeight:" + Height + "px;center:yes;status:no;scroll:yes;help:no;");
}
else
{
window.open(url,"","width=" + Width + "px,height=" + Height + "px,resizable=1,scrollbars=1");
}
}
子页面执行代码后:
Response.Write("<script language='javascript'>window.dialogArguments.window.location = window.dialogArguments.window.location;</script>");
Response.Write("<script>self.close();</script>");
如果是window.open打开的:
Response.Write("<script language='javascript'>window.opener.location.热reload();</script>") ;
Response.Write("<script language='javascript'>window.opener=null;window.close();</script>");
6.关闭当前页面时刷新父页面最终解决办法
由于某种原因,原来页面里或项目的关闭子窗口刷新父页面的方法在有的项目里不好用。现在介绍一种在.net中的万能方法。
1.在父页面中加一个隐藏的LinkButton(好像只有LinkButton会产生:__doPostBack()事件),不用设置它的Visible属性,只需把它显示的文字清空,如下所示:
<asp:linkbutton id="btnFresh" tabIndex="-1" Runat="server"></asp:linkbutton>
2.在这个LinkButton的单击事件中写你要处理的事情,如下所示:
protected void btnFresh_Click(object sender, EventArgs e)
{
你要处理的事情;
}
3.在父页面的Page_Load事件中写:
btnFresh.Attributes.Add("onfocus", "javascript:__doPostBack('btnFresh','');")
当Linkbutton获得焦点时触发单击事件
4.在父页面中写如下JS
<script language="javascript">
<!-- function openwin(budgetyear,budgetitem,department)
{
//弹出模态窗口
var url = "budget/budget_share2_share_e.aspx?budgetyear=" +budgetyear+"&budgetitem="+budgetitem+"&department="+department;
var option = "dialogHeight: 500px, center: yes; status: no;help:no;";
var result = window.showModalDialog(url, option);
if (result == "OK") //子页面里的window.dialogArguments.returnValue = 'OK'
{
document.all["btnFresh"].focus();//这样保证在子页面关闭时就给父页面的Linkbutton复了焦点,从而触发Linkbutton的单击事件 }
}
</script>
5.在子页面里的[确定]按钮事件的最后面写上
string strReturn="<script language=javascript>";
strReturn+="window.dialogArguments.returnValue = 'OK';window.close()";strReturn+="</script>";
this.Page.RegisterClientScriptBlock("",strReturn);
Response.Expires简述
用base target =self(转载)
使用模型窗口时,重复打开画面的解决方法
最近项目中一个小问题卡了我不少时间。我遇到的问题是:在项目的弹出式的模型窗口里,我需要将数据提交到服务器。然后从服务器再返回到本页面。结果:返回了本页面,窗口却是从新打开的。
现在来谈一下解决方法:书上说在模型窗口中加入<base target="_self"/>标签即可。我把该标签放上去却没有任何反应,当时我不明白这为什么?后来经过查证原来这个属性有IE6与IE7之分。忘了说我的浏览器是IE7的。
注:
1、如果你是IE6,你将<base target="_self"/>加入到<head>标签里就可以了。
2、如果你是IE7,你必须将<base target="_self"/>加入到<head>的对口中位置。
代码示例:
<html>
<head>
<title>test</title>
<base target="_self"/>
.............
</head>
</html>
window.showModalDialog方式/模式窗口数据不刷新(缓存)问题
response.expires
一般情况下,当用户请求WEB服务器时,服务器把请求回复给客户端。在客户端,浏览器把缓存作为一种加快速度的策略,就是当请求时先检查缓存的情况,如果有就直接调缓存了,而不请求服务器了。
在WEB程序设计中,有时为了防止重复的提交或者严格的次序等,必须让用户的数据立即在使用后就过期,当用户后退时就显示过期而不能继续使用。也算是为安全考虑的吧。
一般,response.expires写在页面的最上端,后面跟的是一个时间,就是过期的时间,0表示立即过期。
-1也是一样的道理.即是-9999也是一样的
Ajax(Asynchronous JavaScript + XML)的定义
1. <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
2.<asp:TextBox ID="txtUserId" runat="server" CssClass="t-txt" OnTextChanged="txtUserId_focusOut"
onblur="javascript:return checkUserId();" MaxLength="4" TabIndex="2">
</asp:TextBox>
3.<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="txtUserName" runat="server" AutoPostBack="true" CssClass="t-txt"
ReadOnly="True" BackColor="#E8E8E8" TabIndex="-1"></asp:TextBox>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="txtUserId" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>
RegisterStartupScript和RegisterClientScriptBlock输出位置的区别
Page.Response.Write(" < script> var response; < /script> " );
Page.RegisterStartupScript(" RegisterStartupScript" ," < script> var RegisterStartupScript; < /script> " );
Page.RegisterClientScriptBlock(" RegisterClientScriptBlock" ," < script> var RegisterClientScriptBlock; < /script> " );
Response.Write输出后的位置在源文件的第一行.
RegisterClientScriptBlock输出后的位置会在< form> 的下一行.(在asp.net自带的脚本和一些隐藏域之下).
RegisterStartupScript输出后的位置会在< /form> 的上一行.
RegisterClientScriptBlock的原型与RegisterStartupScript相同,两个函数不同在于将其包含的脚本代码写入到HTML文件的不同位置.RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(doucument对象)进行交互的语句,则推荐使用RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行,则可以使用RegisterClientScriptBlock或Response.Write。
RegisterClientScriptBlock一般返回的是客户端函数的包装,而RegisterStartupScript返回得函数在document装载完成后会执行,类似于我们平时所说的body onload=" f()" 里面的函数;这两个方法在客户端呈现的代码位置不同,RegisterClientScriptBlock在< form runat=server> 之后,而RegisterStartupScript在< /form> 之前。
补充例子:
....
< /HEAD>
< body MS_POSITIONING=" GridLayout" >
< form name=" Form1" method=" post" action=" WebForm6.aspx" id=" Form1" >
< input type=" hidden" name=" __VIEWSTATE" value=" dDw3MzU1MTQ5MzY7Oz6nugrEg+5T6RC7MTIuLoIrMLQLPw==" />
< script> function block(){ } < /script> ------------> RegisterClientScriptBlock()方法输出的在这里
< input name=" TextBox1" type=" text" id=" TextBox1" style=" Z-INDEX: 101; LEFT: 296px; POSITION: absolute; TOP: 120px" />
< script> function startup(){ } < /script> ------------> RegisterStartupScript()方法输出的在这里
< /form>
< /body>
< /HTML>
有关一个.aspx文件中放置多个Form的疑问
问:
其实每个Form我已经用不同的ID来标识了,为什么还会出现这样的错误?难道ASP.Net不允许一个页面中存在多个Form吗?
另外还想问一下,如果一个页面有多个Form,也就对应多个提交按钮,那么Page.IsValid值是如何判断的?
答1:
.NET下只能有一个唯一的form
答2:
.net默认在一个aspx文件中只能放一个form
你如果要达到多表单效果,可以用容器,比如说:panel。
panel控件就很好,我用过一些,你将需要显示的东西放在各个panel里,不想显示的只要将
panel的visable属性设为false就行。这样就代替了多个form
答3:
ASP.NET只允许有一个runat="server"的Form,但允许有不含runat="server"的其它form存在,这跟ASP.NET的Page Framework的postback机制有关
答4:
你还是可以加传统的Form,但是不能在服务器端使用
答5:
Page.IsValid是对应RunAt=Server的那个Form,因为只有这个Form,Asp.Net会自动加上OnSubmit的Javascript
在windows server 2003下发附件,上传大文件注意事项?
在windows server 2003下携带多个附件或者较大的附件进行发送时系统报错:
Request 对象 错误 'ASP 0104 : 80004005'
不允许操作
出现上述信息,请进行如下操作:
先在服务里关闭iis admin service服务
找到windows\system32\inesrv\下的metabase.xml,
打开,找到ASPMaxRequestEntityAllowed 把他修改为需要的值,默认为204800,即200K
然后重启iis admin service服务
把它修改为51200000
windows server 2003 iis6.0 相对路径的解决方案
(1)JavaScript 相对路径
初始写法,次写法在IIS6.0中不认
<script
type="text/javascript" src="../Content/JS/Common.js">
</script>
因此改为以下写法
<script
type="text/javascript" src='<%=ResolveUrl("../Content/JS/Common.js")%>'>
</script>
也可以用ResolveUrl("~/...");
(2)在IIS中 属性->主目录->配置->选项中。把”启用父路径“前面打上勾。确认刷新。
脚本发生错误 res://ieframe.dll/aboutXP.dlg
我在IE7中打开帮助-->>关于Internet Exploer-->>就会出现出错提示,
存储空间不足 无法完成此项操作
是因为注册表中IE相关的User-Agent等子项含非标准无效键值,超出默认的字符空间,以至于出错的,这些键值通常是由安装第三方浏览器造成的
你这样处理:
运行注册表,将“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent”项下都删除了就没问题了。
解决IIS写Excel的权限问题
20##-12-24 09:36
ViewState static 就在当前页面中保存数据的.
谨慎Asp.net中static变量的用法
20##-12-11 11:44
关于ASPNET用户的权限
您正在看的asp教程是:关于ASPNET用户的权限。 关于ASPNET用户的权限
在ASP.NET下开发Web应用程序的时候, 尤其是和读写文件有关的情况下, 常常会发生ASPNET用户对某一个目录没有相应权限的问题, 这一点在NTFS分区中尤为明显.
我们一般的解决方法就是在这个目录上点击右键, 然后在"属性"中选择"安全", 然后添加ASPNET用户到当前用户列表中.
这样的方法固然可以, 不过如果有多个目录的话,就需要反复的操作, 显得繁琐了一些, 所以我们可以通过另一个方法来实现同样的效果, 而且更高效.
我们可以在"管理工具"中, 选择"系统工具"-"本地用户和组"-"组", 双击"Administrator", 然后把ASPNET用户添加到组中. 这样一来, ASPNET用户就拥有了Administrator组的所有权限, 自然也就拥有了对所有目录的读写权限.
删除服务器的文件夹后,session就丢失的问题
很大可能是因为你删除了目录后导致了应用程序的重启
l最简单的办法就是不要使用默认的方式也即
InProc(默认,进程内的会话状态):Session存储在IIS进程中(Web服务器内存)。如果使用的是Windows 20## Server或Windows XP,IIS使用aspnet_wp.exe进程,如果使用的是Windows 20## Server,IIS使用w3wp.exe。
InProc拥有最好的性能。但进程内Session很容易丢失Session信息。如果重启了应用程序,所有的Session信息就会丢失。而很多原因都会导致ASP.NET应用程序的重启。
Ø 修改了Web.Config或Global.asax文件,或改变了文件的修改日期。
修改了\bin或\App_Code目录里的文件。Ø
Ø 防病毒软件修改了上述文件等等
你可以考虑以下两种方式
StateServer(进程外的会话状态):Session存储在独立的Windows服务进程aspnet_state.exe中
如果要启用StateServer中的Session状态,首先要在”控制面板”--“管理工具”--“服务”中,启用ASP.NET State Services(ASP.NET 状态服务),并将此服务设置为Automatic(自动启动)
启动ASP.NET状态服务后,需要配置ASP.NET应用程序来使用它。
我们需要在Web.Config文件中system.web节点中添加如下代码
<sessionState mode="StateServer" stateNetworkTimeout="20"
stateConnectionString="tcpip=127.0.0.1:42424" />
首先,mode属性被设为StateServer。接着,stateConnectionString属性用来指定ASP.NET状态服务器端的位置。连接位置被创建为在127.0.0.1,端口42424。最后,stateNetworkTimeout属性用来指定连接超时的秒数。
需要注意的是,此时必须把对象标注为可序列化后(使用Serializable特性标记需要序列化的类)才能在服务中进行存储。Microsoft建议所有的开发人员在开发过程中都使用进程外的会话状态,以避免项目如果切换到其他进程外的提供程序或SqlServer而导致站点的错误。
或者使用
SqlServer:Session存储在SqlServer数据库的表中,可以用aspnet_regsql.exe配置它(SqlServer服务器)
ASP.NET 状态服务 及 session丢失问题解决方案总结[转]
最近在开发一ASP.NET2.0系统时,在程序中做删除或创建文件操作时,出现session丢失问题。在网上搜了不少资料,最后终于解决了,采用了如下方法:
1、asp.net Session的实现:
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
2、丢失原因:
c#中struct和class的区别
VS2008不能DEBUG(当前不会命中断点,还没有为该文档加载任何符号)解决方案
20##-01-09 14:55