问题1:iis 中的asp.net有两种选择方式,vs 2003 对应的是 asp.net1.1 ,而 vs 2005 对应的是asp.net 2.0 如果没有按照这个要求来的话,vs 会出错。

问题2:iis中的虚拟目录在本机上,能正常访问,可是在别的机器上就无法访问了?检查本机是否装了防火墙 ,或者启用了操作系统自带的防火墙。如果有的话检查防火墙中是否开启了80端口,如果没有就需要开启。如果没有安装防火墙,那很有可能是中了木马病毒,赶紧查杀病毒吧!

问题3:一把情况下,要下安装iis,再安装VS 2005 ,若是刚好顺序颠倒了,或者已经装好两个软件的情况下,卸载IIS,再次装上iis,这个时候就会出现“访问 IIS 元数据库失败”的错误。解决方案:重新注册iis,在cs的命令提示状态的命令行中输入这个语句: aspnet_regiis.exe   -i

问题4:如何重启IIS ?
如果是IIS5.0 就只能在管理工具中,手动重启iis admin 服务,如果是高版本的iis ,比如说iis 6.0可以在interner 信息服务窗口中重启iis。

问题4:iid无法启动?
在命令行中运行“netstat -an“,查看当前端口占用情况。
然后结束占用80端口的那个应用程序就可以了。

问题5:HTTP/1.1  500 Server Error

.net中,WEB服务器错误,"http://1.1 500 server error" 解决办法尝试创建WEB项目或打开位于URL"http://localhost/webapplication1"的WEB项目时,WEB服务器报告以下错误,."http://1.1 500 server error"  
 
以下摘自Asp.net技术论坛:
产生这种错误的可能性有很多,其中常见的一种是IIS组件和FrontPage扩展引起的,如果出现这个问题的话,请先重装IIS组件和FrontPage扩展,然后重启再试试。
还有一种是注册dll的问题,试试运行Regsvr32 scrrun.dll,不行的话,再运行regsvr32 script.dll,还是不行的话运行aspnet_regiis -i
第三种方法是在Visual Studio.Net 的命令行里输入以下代码:
iisreset /stop
net user ASPNET /delete
aspnet_regiis -i
iisreset /start
第四种:看看你的IIS的默认端口是不是80,如果不是,改过来。
第五种:看看你是不是用了代理?如果用了,就去掉。
第六种:先看看“事件查看器”,如果“应用程序日志”出现“未能启动 aspnet_wp.exe,原因是配置文件的 processModel 节中提供的用户名和/或密码无效。”的记录,就需要配置你的Machine.config中的ProcessModel设置,设Username=“machine”为Username=“System”
这个配置文件在\winnt\microsoft.net\framework\[版本]\config\下(具体可以搜索).
第七种:重装机器。

我通过方法6来解决,然后重启机器就好了。


解决方案2:

可能是下面的三种情况,原因是这些组件可能受到了破坏,依次在运行里面输入试试
regsvr32 %windir%/system32/jscript.dll
regsvr32 %windir%/system32/vbscript.dll
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_regiis.exe -i
dotnet版本号现在有三种,你装的哪一个就改成哪一个
v1.1.4322
v1.0.3705
v2.0.50727

问题6:Microsoft JET Database Engine (0x80040E09)
asp网站访问的时候出错。

解决方案一:
打开“工具”——“文件夹选项”选择“查看”,把“使用简单文件共享”的沟去掉。
到网站目录所在的文件夹,“右键”——“属性”——“安全”,添加一个用户“Everyone”或者用户“ iusr_机器名”,同时赋予它可读可写的权限。
补充: “iusr_机器名”是Internet 来宾帐户。

 (待续)

posted @ 2008-10-08 17:03 李欢欢 阅读(139) | 评论 (0)编辑
在我们从业务逻辑层获得数据实体时候,接下来的事情就是要绑定到控件中。数据实体中的一些字段可以直接绑定到界面中,但是有一些字段需要重新格式化格式。比如货币单位字段,需要显示货币符号和每隔三位显示分隔符;再比如日期字段,数据库中存放的是日期和时间,但是在界面上需要按照XXXX年XX月XX日的格式显示。这时候我们就用到了DataFormatString属性。

<asp:GridView ID="grvResult" runat="server" AutoGenerateColumns="False" Width="100%">

    <Columns>

        <asp:BoundField HeaderText="预定日期" DataField="OperationDate" DataFormatString="{0:yyyy-MM-dd}" HtmlEncode="False">

        </asp:BoundField>     

        <asp:BoundField HeaderText="订单总计" DataField="TotalRate" DataFormatString="{0:C}" HtmlEncode="False">

        </asp:BoundField>

    </Columns>

</asp:GridView>

        例如上面的代码展示了日期和货币两种绑定方式。DataFormatString中的{0}是固定的格式,这和String.Fromat(“{0}”, someString)中的{0}是一个用法,表示绑定上下文的参数索引编号。然后,在后面加入格式化字符串,具体的使用方法可以参考MSDN。

       这里需要注意以下几点
       1:在GridView中的asp:BoundField使用DataFormatString必须设置属性HtmlEncode="False",否则不起作用。

       2:如果需要使用日期类型的格式化字符串,必须数据实体中对应的字段也应该日起类型的。

       3:格式化字符串C代表货币单位,需要绑定的数据类型应该是数字类型的。如果是字符串类型的不起作用,需要手动添加格式化字符串为DataFormatString="{0:C}"

       使用 DataFormatString 属性来提供列中各项的自定义格式。

       获取或设置指定列中各项的显示格式的字符串。指定列中各项的显示格式的格式化字符串,默认值为 String.Empty。

  数据格式字符串由以冒号分隔的两部分组成,形式为 { A : Bxx }。例如,格式化字符串 {0:F2} 将显示带两位小数的定点数。  

  整个字符串必须放在大括号内,表示它是格式字符串,而不是实际字符串。大括号外的任何文本均显示为实际文本。

  冒号前的值指定在从零开始的参数列表中的参数索引。值只能设置为 0,因为每个单元格中只有一个值。

  冒号后的字符指定值的显示格式。下表列出了一些常用格式。

格式字符   说明

C   以货币格式显示数值。

D   以十进制格式显示数值。

E   以科学记数法(指数)格式显示数值。

F   以固定格式显示数值。

G   以常规格式显示数值。

N   以数字格式显示数值。

X   以十六进制格式显示数值。

MSDN示例:

<asp:BoundColumn HeaderText="Item" DataField="Item" ReadOnly="True" /> <asp:BoundColumn HeaderText="Quantity" DataField="Qty" DataFormatString="{0:N0}"/> <asp:BoundColumn HeaderText="Price" DataField="Price" DataFormatString="{0:c}" /> <asp:BoundColumn HeaderText="Weight" DataField="Weight" ReadOnly="True" DataFormatString="{0:F3}" /> <asp:BoundColumn HeaderText="Expires" DataField="Expires" ReadOnly="True" DataFormatString="{0:g}" />

格式日期:DataFormatString="{0: yyyy-MM-dd}"   

格式时间:DataFormatString="{0: hh:mm:ss}"  

说明:大写的M是 Month,小写的m是minute ,注意区别大小写,C#里其它时候了是这样的用法,要区别大小写。

格式字符串 输入 结果
"{0:C}" 12345.6789 $12,345.68
"{0:C}" -12345.6789 ($12,345.68)
"{0:D}" 12345 12345
"{0:D8}" 12345 00012345
"{0:E}" 12345.6789 1234568E+004
"{0:E10}" 12345.6789 1.2345678900E+004
"{0:F}" 12345.6789 12345.68
"{0:F0}" 12345.6789 12346
"{0:G}" 12345.6789 12345.6789
"{0:G7}" 123456789 1.234568E8
"{0:N}" 12345.6789 12,345.68
"{0:N4}" 123456789 123,456,789.0000
"Total: {0:C}" 12345.6789 Total: $12345.68

其常用的日期格式如下表所示:

格式 说明 输出格式
d 精简日期格式 MM/dd/yyyy
D 详细日期格式 dddd, MMMM dd, yyyy
f 完整格式 (long date + short time) dddd, MMMM dd, yyyy HH:mm
F 完整日期时间格式 (long date + long time) dddd, MMMM dd, yyyy HH:mm:ss
g 一般格式 (short date + short time) MM/dd/yyyy HH:mm
G 一般格式 (short date + long time) MM/dd/yyyy HH:mm:ss
m,M 月日格式 MMMM dd
s 适中日期时间格式 yyyy-MM-dd HH:mm:ss
t 精简时间格式 HH:mm
T 详细时间格式 HH:mm:ss

posted @ 2008-07-25 10:38 李欢欢 阅读(97) | 评论 (0)编辑

    这学期,我在参加一个研究性学习。开始我们小组一共有3个同学,没过多久就剩下我一个人了。我们做的是一个“教务网管理系统”,同组的两个同学以“不知道怎么做”为理由推出了这个研究性学习,所以这个项目全部都是我一个人做的。

    因为我是一个初学者,所以我边学边做,只要学到什么新的东西,我就在项目中用它。即使不是很合理,我也依然用。我刚开始接触了Session这个东西,我刚开始用它统计网站在线人数,后来我用它传值(从session中读取需要的信息),再后来我用session做身份验证(在页面的Page_Load事件中,试图从从服务器读取当前的Session,如果session里面的值为空,我就断定非法登陆,就将用户重定向到登陆页面)。之前开发的时候,偶尔会出一些诸如数据读取失败的错误,我也没有怎么在意。后来,我尽量把页面的逻辑变得简单,我用了母版页,只在母版板页的Page_Load事件中做身份验证,但是有时候还会出一些莫名其妙的问题。最近才知道,session会由于一些原因丢失。

Session丢失的原因如下:
原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失

原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失

原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开

原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失

原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式

解决Session丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失

后来,我又想想:为什么传值一定要用Session呢?难道没有更好的传值的方法?在网上查了好多资料,才知道还有以下这些方法在不同的页面之间传值:
ASP.NET跨页面传值技巧:
  1.  使用QueryString变量
    QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子:
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
    string s_url;
    s_url = "b.aspx?name=" + Label1.Text;
    Response.Redirect(s_url);
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
    Label2.Text = Request.QueryString["name"];
}

  2.  使用Application 对象变量
    Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
    Application["name"] = Label1.Text;
    Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
    string name;
    Application.Lock();
    name = Application["name"].ToString();
    Application.UnLock();
}

  3.  使用Session变量
    想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
    Session["name"] = Label.Text;
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
    string name;
    name = Session["name"].ToString();
}

  4.  使用Cookie对象变量
    这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。

a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
    HttpCookie cookie_name = new HttpCookie("name");
    cookie_name.Value = Label1.Text;
    Reponse.AppendCookie(cookie_name);
    Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
    string name;
    name = Request.Cookie["name"].Value.ToString();
}

  5.  使用Server.Transfer方法
    这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。
a.aspx的C#代码
public string Name
{
    get{ return Label1.Text;}
}
private void Button1_Click(object sender, System.EventArgs e)
{
    Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
    a newWeb;   //实例a窗体
    newWeb = (source)Context.Handler;
    string name;
    name = newWeb.Name;
}

还有,为什么还要像asp一样使用session进行身份验证呢?ASP.NET里面不是有好几种身份验证模式吗?Windows验证 Forms验证 Passport验证,这些身份验证的使用是通过配置Web.config文件的< Authentication >配置节来实现的。
ASP.NET身份验的实现:
(待续)

posted @ 2008-06-20 20:07 李欢欢 阅读(298) | 评论 (0)编辑