再谈ASP.NET第二 - ASP.NET 技巧收集

Tip 1:

ASP.NET 的错误处理

方式1:通过配置文件:

Web.config中有一个名为<customErrors>的节点,通过配置这个节点,ASP.NET在遇到错误时可以知道应该怎样处理。先看如下配置示例:

1 <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
2     <error statusCode="403" redirect="NoAccess.htm" />
3     <error statusCode="404" redirect="FileNotFound.htm" />
4 </customErrors>

 <customErrors> 节点的defaultRedirect属性配置的页面表示当系统中出现未知的错误时,将转向此处指定的页面,并在这个页面中给出用户友善的提示。这个节点中还包含一个名为error的子节点。在这个子节点中可以为已知的错误类型配置相应的处理方式,即当发生这些类型的错误时将不再转向通用的错误提示,而是转向指定的错误处理页。

 

方式2:在Global.asax中处理错误

可以通过在Global.asax中编写Application_Error事件的处理函数来在配置文件中配置的处理方式之前来进行一些处理,如将错误信息的主要内容发送邮件到管理员的邮箱。

1 void Application_Error(object sender, EventArgs e) 
2 { 
3     //在出现未处理的错误时运行的代码
4 }

在此函数中可以通过

1 Exception ex = HttpContext.Current.Server.GetLastError();

这个方法来的导致这个处理的异常对象。我们可以分析其中信息并进行进一步处理。

需要注意的是,通过 Server.GetLastError() 方法取得的异常还不是最终导致问题的异常,而是一个UnhandledException类型的对象,其InnerException属性包装了实际的异常对象(当然这个异常对象还可能有InnerException,通过递归过程我们可以找到最内部的InnerException)。

另外我们也可以使用 Server.GetLastError().GetBaseException() 直接获得最终的InnerException,而不用自编码这个递归查找过程。

 

Tip 2

通过代码为页面添加meta标记

HtmlMeta是专门向页面提供元数据的类,是属于Html控件的一种。

首先需要添加对如下命名空间的引用:

1 using System.Web.UI.HtmlControls;

在如下方法中编写代码即可。

1 protected void Page_Load(object sender, EventArgs e)
2 {
3     HtmlMeta metaTag = new HtmlMeta();
4     metaTag.Name = "keywords";
5     metaTag.Content = "keywords";//内容可以使存储于多个地方的数据,如数据库等
6     Page.Header.Controls.Add(metaTag);
7 }

如上述代码,Header本市也是一个控件,HtmlMeta被添加到Header控件的Controls属性中。页面生成时,HtmlMeta被转换为一个<meta>标签放入页面<head>部分。

 

Tip 3

母版页与内容页的互相访问

母版页与内容页都可以包含控件的事件程序。对于控件而言,事件是在本地处理的,及内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件。控件事件不会从内容页发送到母版页。同样,也不能在内容页中处理来自母版页控件的事件。如果需要访问母版页的控件和属性需要使用如下几种方式:

1. 通过FindControl方法获取母版页控件的引用

从母版页中访问内部控件直接通过Page对象获取控件引用即可。如果要从内容页中获取母版页控件的引用。也许到使用Page对象,但重点使用的是Page对象的Master属性。该属性能够实现对相关母版页基类MasterPage的引用。(所有母版页继承自MasterPage对象正如所有页面继承自Page对象)。但是只获

MasterPage的引用后还不能直接访问母版页中的对象,因为它们被标记为受保护的(protected)。需要使用MasterPageFindControl方法来获取要访问的控件的引用。

代码形如:

1 LabelInContent.Text = (Master.FindControl(“LabelInMaster”) as Label).Text;

2. 使用MasterType指令获取母版页控件的引用

在内容页使用MasterType指令后,将是内容页中的Page对象的Master属性被强类型化。这样就可以在内容页中使用Master对象访问母版页公共方法。属性和控件等成员。在设置MasterType指令时,需要提供给VirtualPath属性母版页的存储地址。

简单示例:

在母版页中,定义一个公共属性来包装母版页中的Label控件,如下:

1 public Label MasterPageLabel
2 {
3     get{ return Label1; }
4     set{ Label1 = value; }
5 }

页面中 <asp:Label ID=”Label1” runat=”server”></asp:Label> 

包装的作用是,本身定义于母版页的控件不是一个公共成员,包装就是将其包装为公共成员。下面看内容页:

首先是MasterType指令:

1 <%@ MasterType VirtualPath=”~/MasterPage2.master” %>

这样就可以按如下方式访问:

1 Master.MasterPageLabel.Text = “测试文字来自内容页”;

 

Tip4

动态加载母版页

实现动态加载母版页的核心是设置MasterPageFile属性值。这个值应该在Page_PreInit事件处理程序中进行设置(而不是Page_Load事件处理函数中)。

如果需要在内容页中访问母版页中的内容,需要给这多个母版页定义一个统一的基类(这个基类需要继承自MasterPage基类),在其中定义供内容页调用的属性。在定义母版页时,需要继承自这个类。

这个基类的定义大致如下:

1 public class BaseMaster : MasterPage
2 {
3     string _title = "";
4     public virtual string TitleName
5     {
6         get { return _title; }
7     }
8 }

定义的母版页形如:

.master中最主要的是:

1 <%@MasterLanguage="C#"CodeFile="MasterPage.master.cs"Inherits="BaseMaster"%>

 

这个类是那个公共的基类。

后置代码文件.master.cs中:

需要如下代码:

 1 public partial class MasterPage : BaseMaster
 2 {
 3     public override string TitleName
 4     {
 5         get { return "母版页 - 1"; }
 6     }
 7 
 8     protected void Page_Load(object sender, EventArgs e)
 9     {
10         //
11     }
12 }

内容页需要进行的处理

.aspx页,这其中最重要的是添加一个页面声明:

1 <%@MasterTypeTypeName="BaseMaster"%>

其中指定了母版页的基类,由此也可以看出这条页面指令的VirtualPathTypeName属性不能同时使用。

然后.aspx.cs中选择母版页

1 protected void Page_PreInit(object sender, EventArgs e)
2 {
3     this.MasterPageFile = "DefaultMasterPage1.master";
4 }

这样就可以以强类型方式访问母版页的属性:

1 this.Title = Master.TitleName;

 

Tip5

母版页应用范围/针对不同客户端处理

母版页的应用范围有三个等级:页面级、应用程序级和文件夹级。

页面级是最常见的。通过页面声明中的设置,即可完成母版页的设置。

1 <% Page Language=”C#” MasterPageFile=”…” %>

应用程序级,对整个应用中多数页面都需要绑定同一母版页时,使用这种设置方式。这种方式通过web.config文件完成。

1 <configuration>
2          <system.web>
3                    <pages MasterPageFile=”…”  />
4          </system.web>
5 </configuration>

文件夹级,需要针对某个文件夹内的文件设置一个母版页时,使用这种设置。这种方式类似第二种,只不过是把web.config文件放置在文件夹中,而不是放置在应用根目录下。

注意:使用后两种方式时,仍然可以使用页面声明。页面声明可以覆盖web.config的设置。

另外:一个页面声明中可以指定针对不同浏览器端的多个母版页,如下示例:

1 <%@ Page Language=”C#” MasterPageFile=”MasterPage.master” Opera:MasterPageFile=”OperaMasterPage.master” %>

这个浏览器可以在如下文件中设置:X:\Windows\Microsoft.NET\Framework\v2.0.xxxxx\Config\Browsers中的.browser文件。

 

Tips6

WebConfig加密方法:

加密连接字符串:

1 aspnet_regiis -pef "connectionStrings" "C:\wwwroot\website"

其中 -pef 表示根据文件绝对路径执行加密配置节

connectionStrings表示所要揭秘的配置节的名称

最后一个参数是Web站点所在的文件夹绝对路径

解密:

1 aspnet_regiis -pdf "connectionStrings" "C:\wwwroot\website"

同理 -pdf 表示根据文件夹绝对路径执行解密,其余参数同上

加密操作依赖基于本机的密钥,所以解密操作需从相同的机器完成。

 

Tips7

根据浏览器版本设置,样式或者脚本。

  • <!--[if !IE]>IE外都可识别 <![endif]-->
  • <!--[if IE]> 所有的IE可识别 <![endif]-->
  • <!--[if IE 5.0]> 只有IE5.0可以识别 <![endif]-->
  • <!--[if IE 5]> IE5.0IE5.5可以识别 <![endif]-->
  • <!--[if gt IE 5.0]> IE5.0以及IE5.0以上版本都可以识别 <![endif]-->
  • <!--[if IE 6]> IE6可识别 <![endif]-->
  • <!--[if lt IE 6]> IE6以及IE6以下版本可识别 <![endif]-->
  • <!--[if gte IE 6]> IE6以及IE6以上版本可识别 <![endif]-->
  • <!--[if IE 7]> IE7可识别 <![endif]-->
  • <!--[if lt IE 7]> IE7以及IE7以下版本可识别 <![endif]-->
  • <!--[if gte IE 7]> IE7以及IE7以上版本可识别 <![endif]-->
posted @ 2010-12-20 00:15  hystar  阅读(721)  评论(0编辑  收藏  举报