ASP.NET知识点总结

1、ASP.Net的特色与优势

  • 与浏览器无关
  • 遵循W3C的XHTML标准
  • 方便设置断点,易于调试
  • 编译后执行,运行效率高
  • 代码、微软中间语言MSIL、JIT(调用那部分编译那部分,启动时间更短)、机器语言
  • 丰富的控件库
  • 代码后置,逻辑分明

2、几对概念

  • .aspx和aspx.cs
  • Web服务器和应用程序服务器
  • 代码内置和代码后置

3、解决方案构成

文件、新建网站自动生成一个文件夹和三个文件

  • App_Data文件夹 存放数据
  • Web.Config文件 站点配置文件
  • Default.aspx文件 默认页面
  • Default.aspx.cs文件 默认页面的代码后置文件

4、系统对象与状态管理

  • Page对象:页面执行期内

  • Request对象:页面请求期

  • 属性:Get请求发送的数据QueryString、Post方法发送的数据Form、环境变量ServerVariables、以上三种方法的集合Params

  • Request.ServerVariables[“HTTP_USER_AGENT”]获取当前客户端浏览器的版本;

  • Request.ServerVariables[“HTTP_ACCEPT_LANGUAGE”]获取当前客户端浏览器使用的语言;
    页面传值
    页内数据传递:
    if(!Page.IsPostBack){ 赋值}
    跨页数据传递:
    目的:if(Page.PreviousPage != null)
    If(PreviousPage .IsCrossPagePostBack)
    { PreviousPage.Findcontrol(“控件ID”); 取值}
    Response对象:页面执行期
    方法:
    Write()
    End()
    Redirect()

  • Server对象:
    方法:
    HtmlEncode () 、
    HtmlDecode () 、
    MapPath () 、
    UrlEncode () 、
    UrlDecode () 、
    Execute () 、
    Transfer ()
    Application对象:整个应用程序运行期
    属性:All、AllKeys、Count、Item
    方法:Add()、Clear () 、Get () 、Set () 、Lock () 、UnLock ()

  • Session对象:用户会话期
    属性:SessionID、Timeout、IsNewSession
    方法:Clear () 、Abandon ()
    Cookie对象:保持客户端的共享信息方式
    新建

HttpCookie co = new HttpCookie(“cook”);
co[“name”] = value;
co[“time”] = value;
co.Expires = DateTime.Now.AddDays(3);
Response.Cookies.Add(co);

取值

HttpCookie co = Request.Cookies[“cook”];
co[“name”]  ;
co[“time”]  ;

5、控件的分类

控件分类:HTML服务器控件、Web服务器控件
HTML服务器控件
HTML标签,在ASP中称为HTML控件,服务器不处理
可以转换为HTML服务器控件
在HTML控件上加上runat=“server”属性,都可以转换
Web服务器控件
以<asp:开头, runat=“server”虽然是默认属性,但是必须写
所有的服务器控件都继承自System.Web.UI.Control类
所有的HTML服务器控件位于System.Web.UI.HtmlControls命名空间中
所以的Web服务器控件位于System.Web.UI.WebControls命名空间中

  • 基础控件

Label控件
属性:ID、Text、Visible、ForeColor
Button控件
属性:Text、PostBackUrl
事件:Click
TextBox控件
属性:AutoPostBack、Text、TextMode、Wrap
事件:TextChanged

6、站点地图

站点地图 Web.sitemap
XML格式
根节点siteMap
一个站点地图只能有一个siteMap元素
siteMapNode对应于页面的节点,一个节点描述一个页面
title描述页面
url文件在解决方案中的位置
description说明性文本

Web.sitemap

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/Default.aspx" title="首页"  description="">
	
        <siteMapNode url="BookList.aspx" title="图书浏览"  description="" />
        <siteMapNode url="Cart.aspx" title="购物车"  description="" />
        <siteMapNode url="Search.aspx" title="图书搜索"  description="" />
        <siteMapNode url="" title="用户管理"  description="" >
        		<siteMapNode url="~/Membership/UserRegister.aspx" title="用户注册"  description="" />
         	<siteMapNode url="~/Membership/UserLogin.aspx" title="用户登录"  description="" />
        </siteMapNode>
		
    </siteMapNode>
</siteMap>

7、系统导航

SiteMapPath控件 面包屑导航
PathSeparator ParentLevelsDisplayed
TreeView导航控件
TextField NavigateUrlField
Menu控件
静态显示的级数StaticDisplayLevels、支持的最多级别数MaximumDynamicDisplayLevels、布局类型Orientation

8、母版页

网页典型布局
栏式结构
区域结构
母版页的特点
有利于站点的修改与维护,降低开发人员的工作强度
提供高效的内容整合能力
有利于实现页面布局
提供一种便于利用的对象模型
Html页面加内容
首行:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

可编辑区

<asp:ContentPlaceHolder ID="cphContent" runat="server">      </asp:ContentPlaceHolder>

将现有页改为母版页
在@Page标记中指定MasterPageFile位置
去除多余的html标签
去除form标记
创建asp:ContentPlaceHodler标签,并放入对应的内容
指定相应的ContentPlaceHolerID

母版在不同层级使用时图像路径问题

在配置文件

<appSettings>
    <add key="WebRoot" value="/Web/“   />
 </appSettings>

在全局变量、接收配置文件

 void Application_Start(object sender, EventArgs e) 
{
        // 在应用程序启动时运行的代码
        this.Application.Lock();
        this.Application["webRoot"] =    ConfigurationManager.AppSettings["webRoot"];
        this.Application.UnLock();
 }

在母版

<IMG src="<%=this.Application["webRoot"] %>Images/index-top.jpg“>

Global.asax

<%@ Application Language="C#" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e) 
    {
        // 在应用程序启动时运行的代码
        this.Application.Lock();
        this.Application["webRoot"] = ConfigurationManager.AppSettings["webRoot"];
        this.Application.UnLock();
    }    
    void Application_End(object sender, EventArgs e) 
    {
        //  在应用程序关闭时运行的代码
    }        
    void Application_Error(object sender, EventArgs e) 
    { 
        // 在出现未处理的错误时运行的代码
    }
    void Session_Start(object sender, EventArgs e) 
    {
        // 在新会话启动时运行的代码
    }
    void Session_End(object sender, EventArgs e) 
    {
        // 在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
        // 或 SQLServer,则不会引发该事件。
    }       
</script>

9、系统框架

  • 三层
    数据访问层
    业务逻辑层
    表示层

  • 三层的优势
    适应变化、利于维护
    适用协作开发
    主流趋势

  • 模型层
    项目的命名
    实体类:传递数据的载体
    实体类标识为[可序列化的][Serializable]
    类的命名规范、数据表名、单数
    外键处理方式、主键表对应的实体类型(外键对象)

  • 数据访问层
    项目的命名
    CRUD:Create、Retrieve、Update、Delete
    DBHelper类

DBHelper.cs

public static readonly string CONSTR = ConfigurationManager.ConnectionStrings["SQL_CONSTR"].ConnectionString;
private static SqlConnection CreateConnection(string connectionString)
 {
            SqlConnection con = new SqlConnection(connectionString);
            con.Open();
            return con;
}
 public static int ExcuteCommand(string connectionString, string sql, SqlParameter[] values)
 {
            using (SqlConnection con = CreateConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(sql, con);
                if (values != null) command.Parameters.AddRange(values);
                return command.ExecuteNonQuery();
            }
 }
 public static SqlDataReader GetReader(string connectionString, string sql, SqlParameter[] values)
{
            SqlCommand command = new SqlCommand(sql, DBHelper.CreateConnection(DBHelper.CONSTR));
            if (values != null) command.Parameters.AddRange(values);
            return command.ExecuteReader(CommandBehavior.CloseConnection);
}
 public static object GetScalar(string connectionString, string sql, SqlParameter[] values)
{
            using (SqlConnection con = CreateConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(sql, con);
                if (values != null) command.Parameters.AddRange(values);
                return command.ExecuteScalar();
            }
}
  • 业务逻辑层
    项目的命名
    方法
    表示层
    网站
    文件夹存放位置
    方法的命名与定义规范
    CRUD增查改删:Create、Retrieve、Update、Delete
    c: AddUser(User user);
    r: GetAllUsers(); GetUserById(int id); GetUserByLoginId(string loginId); GetUserBySql(string sql);
    u: ModifyUser(User user);
    d: DeleteUser(user user); DeleteUserById(int id); DeleteUserByLoginId(string loginId);

10、数据绑定

数据绑定的两种方式

  • 编码指定数据源
    指定数据对象
    数据绑定控件ID.DataSource = 类.方法();
    数据绑定控件ID.DataBind();
    指定数据源ID
    数据绑定控件ID.DataSourceID = 数据源控件ID ;

  • 使用数据源控件
    数据绑定的两种方法
    Eval方法
    Eval是只读的方法(单向数据绑定),不想让用户修改的数据用它。

<%#   Eval(“ISBN”).ToString().Trim()  %>

Eval有一个重载的方法,可以实现格式化Eval(“date”,”{ 0 : dd / MM / yyyy}”)
Bind方法
Bind支持读/写更能(双向数据绑定),该方法常与输入控件一起使用,如TextBox控件

<%#  Bind(“Title’)  %>
  • 指定数据源ID的方式和指定数据对象的方式有什么区别
    语法不同,指定数据源ID后即可完成绑定,但是指定数据对象后还需要使用绑定方法DataBind()才能完成数据绑定
    指定数据源ID方式可以使用数据源的功能,如更新、删除等,但指定数据对象的方式只能提供绑定的显示

11、数据源控件

  • 普通数据源控件
    SqlDataSource
    AccessDataSource
    ObjectDataSource
  • 层次化数据源控件
    XmlDataSource
    SiteMapDataSource

12、数据绑定控件

  • 普通绑定控件
    AdRotator
    ListControl
    DropDownList 下拉菜单控件
    CheckBoxList、RadioButtonList、ListBox、BulletList
    CompositeDataBoundControl
    GridView 通过表格方式实现数据的展示,编辑、分页、排序
    DetailsView 显示单条记录的详细信息,添加、删除、修改
    FormView
  • 层次化绑定控件
    TreeView
    Menu
    所以的数据绑定控件共有的重要属性:DataSourceID,用于绑定数据源控件

GridView数据查询与展示、删除

显示一个列表(ObjectDataSource)
将GridView控件拖入页面,新建数据源,选择业务类,选择对应的Select方法
分页:设AllowPaging为ture
外键列的处理:<%# Eval(“CategoryId.Name”) %>
CategoryId是实体类中的外键类型字段,Name是实体类对应的数据表中的外键列对应的主键表中的Id的Name。CategoryId.Id是外键列中的实际值。
删除
设定Delete×××ByID(int id)的删除方法?
从代码中删除一句 OldValuesParameterFormatString="original_{0}“
设定GridView的DataKeysName为id,启用删除,就能使用删除了,别忘了处理主外键关系
GridView中行的DataKeysName与取值
DataKeyNames=“FID”?? 绑定一个值
GridView1.DataKeys[e.Row.RowIndex].Value.ToString();
DataKeyNames=“FID,FName”?? 绑定两个值
GridView1.DataKeys[e.Row.RowIndex].Values[0].ToString();
GridView1.DataKeys[e.Row.RowIndex].Values[1].ToString();

DetailsView 展示

  • 设置数据源
    选定SelectMethod
    外键的处理如下(三个模版中绑定的内容不同):
<asp:TemplateField HeaderText="出版社" SortExpression="PublisherId">
<EditItemTemplate>
<asp:DropDownList ID="ddlPublisher" runat="server" DataSourceID="odsPublisher" DataTextField="Name"
DataValueField="Id" Width="219px" SelectedValue='<%# Eval("PublisherId.Id") %>'></asp:DropDownList>
<asp:ObjectDataSource ID="odsPublisher" runat="server" OldValuesParameterFormatString="original_{0}"
SelectMethod="GetAllPublisher" TypeName="Accp.BLL.PublisherManager"></asp:ObjectDataSource>
 </EditItemTemplate>
<InsertItemTemplate>
 <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("PublisherId") %>'></asp:TextBox>
 </InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Eval("PublisherId.Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>

非外键的,处理如下(三个模版中绑定的内容相同) :

<asp:TemplateField HeaderText="标题" SortExpression="Title">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Title") %>' Width="345px"></asp:TextBox>
 </EditItemTemplate>
 <InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Title") %>'></asp:TextBox>
 </InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("Title") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
  • DetailsView 更新

在业务逻辑层写更新方法
配置数据源的UpdateMethod
和非外键的UpdateParameters

<UpdateParameters>
<asp:Parameter Name="title" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="publishDate" Type="DateTime" />
<asp:Parameter Name="toc" Type="String" />
<asp:Parameter Name="id" Type="Int32" />
 </UpdateParameters>

外键的,在DetailsView1_ItemUpdating方法写:

if (this.DetailsView1.CurrentMode == DetailsViewMode.Edit)
 {
	DropDownList ddlPublisher = this.DetailsView1.FindControl("ddlPublisher") as DropDownList;
	if (ddlPublisher != null)
	{
		this.odsBook.UpdateParameters.Add("publisherId", ddlPublisher.SelectedValue);
	}
 }

业务逻辑层更新方法

public static int ModifyBook(string title, decimal unitPrice, int publisherId, DateTime publishDate, string toc, int id)
{
	Book book = BookService.GetBook(id);
	book.Title = title;
	book.UnitPrice = unitPrice;
	book.PublisherId.Id = publisherId;
	book.PublishDate = publishDate;
	book.TOC = toc;
	int result = BookService.UpdateBook(book);
	return result;
}
  • GridView 7种数据绑定列的类型

BoundField 显示普通文本
DataFormatString属性,设置显示格式,需设HtmlCode属性为false
TemplateField 模版,灵活,直接添加、转换而来
HeaderTemplate
FooterTemplate
ItemTemplate
AlternatingTemplate
EditItemTemplate
Buttonfield 按钮,通过CommandName设置命令
CommandField 创建命令按钮,自动生成命令
HyperLinkField 将绑定的数据以超链接的形式显示
ImageField 绑定图片路径,在表中显示图片列
CheckBoxField 显示bool类型的数据

多选

使用JavaScript、CheckBox

<asp:CheckBox onclick="setSelectAll(this);" />
function setSelectAll(obj)
{
	var boxes=document.getElementsByTagName("input");
	 for(var i=0;i<boxes.length;i++)
	 {
		 if (boxes[i].type=="checkbox")
		{
		 	boxes[i].checked=obj.checked;
		}
	}
}

取值

string ids = String.Empty;
foreach (GridViewRow row in this.GridView1.Rows)
{
	if (row.RowType == DataControlRowType.DataRow)
	{
		CheckBox box = row.FindControl("cbSelect") as CheckBox;
		if (box != null && box.Checked)
		{
			string key = this.GridView1.DataKeys[row.RowIndex].Value.ToString();
			ids = String.IsNullOrEmpty(ids) ? key : ids + "," + key;
		}
	}
}

光棒效果

光棒效果
GridView的行绑定事件RowDataBound()

if (e.Row.RowType == DataControlRowType.DataRow)
{
	e.Row.Attributes.Add("onmouseover", "currColor = this.style.backgroundColor;this.style.backgroundColor='#6699ff';");
	e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor = currColor;");
}

13、数据验证控件

RequiredFieldvalidator必须填字段验证器
ControlToValidate
Text
ErrorMessage
CompareValidator范围验证器
ControlToValidate
ControToCompare
Type
Operator
ValueToCompare
RangeValidator范围验证器
ControlToValidate
MaximumValue
MinimumValue
Type

  • RegularExpressionValidator正则表达式验证器
    非负整数 ^\d+$
    正整数 1* [0-9] [0-9 ]*$
    中文字符 [\u4e00-\u9fa5]
    双字节字符(包括汉字在内) [^\x00-\xff]
    货币(非负数) \d+(.\d\d)?
    货币(整数或负数)(-)? \d+(.\d\d)?
    CustomValidator自定义验证器
    ControToValidate
    ClientValidationFunction
    OnServerValidate
    ValidationSummary验证摘要
    ShowMessageBox
    ShowSummary

  • 日期输入

Calendar控件、日历
SelectedDate属性
VisibleDate属性
TitleFormat属性
SelectionChanged事件
缺陷:每次日历的显示、隐藏、用户的选择日期都会造成循环
JS版日历
My97DatePicker
在使用该日期控件的文件中加入JS库(仅这一个文件即可,其他文件会自动引入,请勿删除或改名)
代码如下
οnfοcus=“new WdatePicker(this,’%Y-%M-%D’,true,‘default’);”

14、文件上载

FileUpload控件、上传文件。 onchang=“checkImg(this)” js控制上传文件的格式
DetailsView1_ItemUpdated() //将选择的图片上传到服务部

if (this.DetailsView1.CurrentMode == DetailsViewMode.Edit)
{
	FileUpload fileUpload = this.DetailsView1.FindControl("FileUpload1") as FileUpload;
	if (fileUpload.PostedFile != null && fileUpload.PostedFile.FileName.Length > 0)
	{
		string path = "~/BookCovers/";
		string isbn = this.DetailsView1.Rows[5].Cells[1].Text;
		path = path + isbn + ".jpg";
		fileUpload.SaveAs(this.Server.MapPath(path));
	}
 }

15、其他服务器控件

MultiView控件、多视图
为View控件提供容器
ImageMap控件、热点区域
ImageUrl
图片地址
HotSpotMode
获取或设置菜单热点区域的默认行为方式。分为设置(NotSet)、定向操作(Navigate)、回转操作(PostBack)、无任何操作(Inactive)4种方式
HotSpots
设置HotSpot对象集合。HotSpot是一个抽象类,它包括CircleHotSpot(圆现热区)、RectangleHotSpot(方形热区)、PolygonHotSpot(多边形热区)三个子类
HyperLink 控件
基于超链接的一个扩展,便于动态的改变链接的地址
NavigateUrl 设置或获取超链接所指向的URL地址
ImageUrl 可设置为图片形式的链接
Text 要为该链接显示的文本

DataList 查询与展示

属性
RepeatDirection项的分布方向
RepeatColumns要用于该布局的列的数目
模版
项模版 ItemTemplate(放一表格进去)、AlternatingItemTemplate、SelectedItemTemplate、EditItemTemplate
页眉页脚 HeaderTemplate、FooterTemplate
分割符模版 SeparatorTemplate

protected void Page_Load(object sender, EventArgs e)
{
	if (!this.IsPostBack)
	{
		this.PageSize = 3;
		this.CurrentPageIndex = 1;
		this.Order = "Id";
		this.FillPageData();
	}
}
protected void FillPageData()
{
	PageResult<Book> pageResult = new PageResult<Book>();
	pageResult.PageSize = this.PageSize;
	pageResult.CurrentPageIndex = this.CurrentPageIndex;
	pageResult.Order = this.Order;
	pageResult = BookManager.GetBookByPage(pageResult);
	this.DataList1.DataSource = pageResult.Data;  //代码绑定数据源
	this.DataList1.DataBind();
}

16、基于SQL语句分页

基于SQL语句分页:pageSize=3 currentPageIndex=3

  • 1、通用(SQL200/SQL2005)排除法not in 、top
    –公式
    select top pageSize * from 表
    where 主键 not in (select top ((currentPageIndex -1) * pageSize) 主键 from 表 order by 字段)
    order by 字段
    –实例
    select top 3 * from books
    where id not in(select top 6 id from books order by id)
    order by id
  • 2、(SQL2005)row_number()分析函数
    –公式
    select * from
    (select *,row_number() over(order by 字段) as rand from 表) as 新表
    where rank between (currentPageIndex -1) * pageSize +1 and currentPageIndex * pageSize
    order by 字段
    –实例
    select * from
    (select *,row_number() over(order by id) as rank from books) as newtable
    where rank between 7 and 9
    order by id
  • 3、(主键为数值时)max()
    select top 3 * from books
    where id > (select max(id) from (select top 6 id from books order by id) as newtable)
    order by id

17、DataList 分页

在模板层,建立一个分页类PageResult

private int pageSize = 3;
private int currentPageIndex = 1;
private int recordCount = 0;
private string order = "Id";
private List<T> data = new List<T>();

在表示层,建立分页属性

protected int PageSize
{
	get { return Convert.ToInt32(this.ViewState["pageSize"]); }
	set { this.ViewState["pageSize"] = value; }
}
protected int CurrentPageIndex
{
	get { return Convert.ToInt32( this.ViewState["currentPageIndex"] ); }
	set {  this.ViewState["currentPageIndex"] = value; }
}
protected string Order
{
	get { return this.ViewState["order"] as string; }
	set { this.ViewState["order"] = value; }
}
protected int PageCount
{
	get { return Convert.ToInt32 ( this.ViewState["pageCount"] ); }
	set { this.ViewState["pageCount"] = value; }
}

ViewState
页面级状态保持变量
表示层,加载第某页数据的方法

protected void FillPageData()
{
	PageResult<Book> pageResult = new PageResult<Book>();
	pageResult.PageSize = this.PageSize;
	pageResult.CurrentPageIndex = this.CurrentPageIndex;
	pageResult.Order = this.Order;
	pageResult = BookManager.GetBookByPage(pageResult);
	this.DataList1.DataSource = pageResult.Data;
	this.DataList1.DataBind();
	this.PageCount = pageResult.PageCount;
	string pageInfo = "第 {0} 页 / 共 {1} 页 记录数:{2}";
	this.lblCurrentPage.Text = String.Format(pageInfo, this.CurrentPageIndex, this.PageCount, pageResult.RecordCount);
	this.txtCurrentPage.Text = this.CurrentPageIndex.ToString();
}

DAL

public static PageResult<Book> GetBookByPage(PageResult<Book> pageResult)
{
	int filter = (pageResult.CurrentPageIndex - 1) * pageResult.PageSize;
	string sql1 = "select count(id) from Books";
	string sql2 = "select top {0} * from Books where id not in(select top {1} id from Books order by {2}) order by {3}";
	sql2 = String.Format(sql2, pageResult.PageSize, filter, pageResult.Order, pageResult.Order);
	return GetPageDataBySql(sql1, sql2, pageResult);
}
private static PageResult<Book> GetPageDataBySql(string sql1, string sql2, PageResult<Book> pageResult)
{
	pageResult.RecordCount = Convert.ToInt32(DBHelper.ExecuteScalar(DBHelper.ConnectionStringLocalTransaction, CommandType.Text, sql1, null));
	List<Book> data = GetBooks(sql2, null);
	pageResult.Data = data;
	return pageResult;
}

分页类PageResult

[Serializable]
public class PageResult<T>
{
	private int pageSize = 3;
	private int currentPageIndex = 1;
	private int recordCount = 0;
	private string order = "Id";
	private List<T> data = new List<T>();
	public int PageCount {
		get  {
		return this.recordCount % this.pageSize == 0 ? this.recordCount / this.pageSize : this.recordCount / this.pageSize + 1;
 		}
    }
 	public List<T> Data {
	get { return data; }
	set { data = value; }
	}
	public string Order {
		get { return order; }
		set { order = value; }
	}
	public int RecordCount {
		get { return recordCount; }
		set { recordCount = value; }
	}
	public int CurrentPageIndex {
		get { return currentPageIndex; }
		set { currentPageIndex = value; }
	}
	public int PageSize {
		get { return pageSize; }
		set { pageSize = value; }
	}
}

Repeater

不自动生成任何HTML标签,效率高,没有默认的外观,完全通过模版控制,用于精确展示

<div id="clsPage">
<asp:Repeater ID="rptBooks" runat="server">
 <HeaderTemplate>
	<ul class="clsUL">
	<li class="clsLi1">书名</li>
	<li class="clsLi2">作者</li>
	<li class="clsLi3">出版社</li>
	<li class="clsLi4">出版日期</li>
	<li class="clsLi5">价格</li>
	</ul>
</HeaderTemplate>
<ItemTemplate>
	<ul class="clsUL1">
	<li class="clsLi1"><%# Eval("ShortTitle") %></li>
	<li class="clsLi2"><%# Eval("ShortAuthor") %></li>
	<li class="clsLi3"><%# Eval("PublisherId.Name") %></li>
	<li class="clsLi4"><%# Eval("PublishDate","{0:yyyy-MM-dd}") %></li>
	<li class="clsLi5"><%# Eval("UnitPrice","{0:C}") %></li>
	</ul>
</ItemTemplate>
<AlternatingItemTemplate>
	<ul class=“clsUL2”>   //变换CSS样式
	相同
	</ul>
</AlternatingItemTemplate>
</asp:Repeater>
</div>

<style type="text/css">
	body{margin:0px;font-size:12px;text-align:center}
	#clsPage{width:960px;text-align:left;}
	#clsPage .clsUL{margin:0px;padding:0px;display-style:none;}
	#clsPage .clsUL .clsLi1{width:300px;float:left;line-height:30px;height:30px;font-weight:bold;}
	#clsPage .clsUL .clsLi2{width:300px;float:left;line-height:30px;height:30px;font-weight:bold;}
	#clsPage .clsUL .clsLi3{width:160px;float:left;line-height:30px;height:30px;font-weight:bold;}
	#clsPage .clsUL .clsLi4{width:100px;float:left;line-height:30px;height:30px;font-weight:bold;}
	#clsPage .clsUL .clsLi5{width:100px;float:left;line-height:30px;height:30px;font-weight:bold;}
	//float控制不换行       
	#clsPage .clsUL1{margin:0px;padding:0px;display-style:none;}
	#clsPage .clsUL1 .clsLi1{width:300px;float:left;line-height:25px;height:25px;}
	#clsPage .clsUL1 .clsLi2{width:300px;float:left;line-height:25px;height:25px;}
	#clsPage .clsUL1 .clsLi3{width:160px;float:left;line-height:25px;height:25px;}
	#clsPage .clsUL1 .clsLi4{width:100px;float:left;line-height:25px;height:25px;}
	#clsPage .clsUL1 .clsLi5{width:100px;float:left;line-height:25px;height:25px;}
	       
	#clsPage .clsUL2{margin:0px;padding:0px;display-style:none;}
	#clsPage .clsUL2 .clsLi1{width:300px;float:left;line-height:25px;height:25px;background-color:#cccccc}
	#clsPage .clsUL2 .clsLi2{width:300px;float:left;line-height:25px;height:25px;background-color:#cccccc}
	#clsPage .clsUL2 .clsLi3{width:160px;float:left;line-height:25px;height:25px;background-color:#cccccc}
	#clsPage .clsUL2 .clsLi4{width:100px;float:left;line-height:25px;height:25px;background-color:#cccccc}
	#clsPage .clsUL2 .clsLi5{width:100px;float:left;line-height:25px;height:25px;background-color:#cccccc}
 </style>
protected void Page_Load(object sender, EventArgs e)
{
	if (!this.IsPostBack)
	{
		List<Book> lst = BookManager.GetBookByCategoryId(25);
		this.rptBooks.DataSource = lst;
		this.rptBooks.DataBind();
	}
}

18、RSS发布

RSS
Really Simple Syndication
简易信息聚合
RSS发布就是提供一个Feed格式的文件,Feed文件就一个XML格式的文件
Repeater控件可以轻松实现数据的绑定,又不会生成任何无用的代码,非常适合用于RSS的发布
后置代码

public string GetUrl(object id)
{
	return "http://" + this.Request.ServerVariables["HTTP_HOST"].ToString() + "/Web/BookDetail.aspx?bid=" + id;
}

利用Repeater在页面循环生成Feed文件

<%@ Page Language="C#" AutoEventWireup="true" ContentType="text/xml" CodeFile="Rss.aspx.cs" Inherits="Rss" %>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="odsBook">
<HeaderTemplate>
 <rss version="2.0">
<channel>
 <title>第三波书店</title>
 <link>www.accpsky.cn</link>
<description>第三波网上书店</description>
 <copyright>Copyright 2009-2010 by zhlb</copyright>
</HeaderTemplate>
<ItemTemplate>
<item>
<title><%# Eval("Title") %></title>
 <author><%# this.Server.HtmlEncode(Eval("Author") as string) %></author>
<description><%# this.Server.HtmlEncode(Eval("ContentDescription") as string)%></description>
<link><%# GetUrl(Eval("Id")) %></link>
<pubDate><%# Eval("PublishDate","{0:D}") %></pubDate>
</item>
</ItemTemplate>
<FooterTemplate>
</channel>
</rss>
</FooterTemplate>
</asp:Repeater>        
<asp:ObjectDataSource ID="odsBook" runat="server" OldValuesParameterFormatString="original_{0}"
SelectMethod="GetBookByCategoryId" TypeName="Accp.BLL.BookManager">
<SelectParameters>
<asp:QueryStringParameter DefaultValue="25" Name="CategoryId" QueryStringField="cid"
Type="Int32" />
 </SelectParameters>
 </asp:ObjectDataSource>

19、数据展示控件的主要用途

  • GridView
    用于对于多行多列数据(或叫表格类数据)
  • DetailsView
    显示单条记录的详细信息
  • DataList
    单行多列、多行单列的数据
    用于创建模版化的列表数据,可以显示一行中有多列的内容,可用于任何重复结构当中的数据,如表格
  • Repeater
    单行多列、多行单列的数据
    不会自动生成任何用于布局的代码,用于内容的精确显示,效率高,配合DIV+CSS布局

20、小技巧

  • 提示弹出小窗口
    this.ClientScript.RegisterStartupScript(this.btnRegister.GetType(),“提示”,“”);
  • 超长的字符省略不显示
public string ShortContentDescription
{
	get
	{
		return this._contentDescription.Length > 150 ? this._contentDescription.Substring(0, 150) + “……" : this._contentDescription;
	}
}

21、第三方控件

富文本框控件
FreeTextBox
FCKeditor
RichTextBox
验证码控件
Webvalidates
生成验证码snCode.Create();
验证snCode.CheckSN(输入的内容); 返回值为bool
代码生成器CodeSmith
分页控件AspNetPager

22、用户控件

用户控件
Web用户控件,后缀.ascx
系统控件与自编代码的联合体
拖放.ascx文件,到其它页面,实现重用。
.ascx文件,不能单独使用
用户控件,可以包含其它用户控件,不能(嵌套)包含自己

23、ASP.NET处理Http请求的两个核心机制

HttpModule
Http请求的必经之路
可以附加信息、做一些额外的工作、终止一个请求,起Filter的作用
HttpHandler
Http请求的真正处理中心

数字水印:指定Handler方式

HttpHandler程序:一般处理程序,后缀.ashx

public class BookCover : IHttpHandler {
	public void ProcessRequest (HttpContext context) {
		context.Response.ContentType = "image/jpeg";
		//加水印代码
	}
	public bool IsReusable {
		get {
			return false;
		}
	}
}

页面中访问图片的路径修改为:
BookCover.ashx?ISBN=数字

数字水印:全局Handler方式

修改配置文件

<system.web>
	<httpHandlers>
		<add verb="*" path="*.jpg" type="CoverHandler"/>
	</httpHandlers>
</system.web>

在App_Code目录底下创建Handler类CoverHandler.cs

public class CoverHandler : IHttpHandler      {
	private readonly string DEFAULTURL = "~/Images/default.jpg"; 
	private readonly string WATERURL = "~/Images/WaterMark.jpg";
	public void ProcessRequest(HttpContext context)    {   //一个请求的所有信息
		Image imgCover = null; //新建一个图象,用于代替原图,作为封面显示
		Image imgWater = Image.FromFile(context.Server.MapPath(WATERURL));  //水印图象
		if (File.Exists(context.Request.PhysicalPath))        {  //如果原图象存在
			imgCover = Image.FromFile(context.Request.PhysicalPath);  //把原图象赋给封面
			Graphics g = Graphics.FromImage(imgCover);   //获取封面图片的画笔
			g.DrawImage(imgWater, imgCover.Width - imgWater.Width, imgCover.Height - imgWater.Height, imgWater.Width, imgWater.Height);   //往封面上面画水印
			g.Dispose();  //释放资源
			imgWater.Dispose(); //释放资源
		}
		else
		{
			imgCover = Image.FromFile(context.Server.MapPath(DEFAULTURL));  //默认图象做封面
		}
		context.Response.ContentType = "image/jpeg";
		imgCover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
		context.Response.Flush();  //向客户端发送当前所有缓冲的输出
		imgCover.Dispose(); //释放资源
		context.Response.End();  //结束请求
	}           
}

24、数据库连接字符串加密、解密

工具:aspnet_regiis.exe

加密:

aspnet_regiis.exe –pef section physical_directory –prov provider  或
aspnet_regiis.exe –pe section –app virtual_dirctory –prov provider 

section 指定表示要加密的配置节
physical_directory 指定站点的物理路径
virtual_dirctory 指定虚拟路径
provider 指定加密提供程序DataProtectionConfigurationProvider
解密

aspnet_regiis.exe –pdf “connectionStrings” “路径”

基于配置文件的身份验证

站点根目录写入Web.config

<system.web>
	<authentication mode=“Forms”>      //身份验证
		<forms name="book_userName" loginUrl="~/Admin/AdminLogin.aspx" timeout="60">
			<credentials passwordFormat="Clear"> </credentials>
		</forms>
	</authentication>
</system.web>

受保护文件根目录Admin写入Web.config

 <system.web>
	<authorization>             //授权 
		<deny users=“?”/>        //拒绝匿名用户
	</authorization>
</system.web>

登录

if (登录方法,数据库合法用户)
{
	this.Session[“currUser”] = currUser;  // 保存登录状态
	FormsAuthentication.SetAuthCookie(this.txtLoginId.Text, true);  //发票证
	string returnUrl = this.Request.QueryString["ReturnUrl"] as string;  
	if (String.IsNullOrEmpty(returnUrl))   //判断登录前是否有请求页
	{
		this.Response.Redirect(~/Admin/ManageAllUser1.aspx”);  //默认页
	}
	else
	{
		this.Response.Redirect(returnUrl);  //转向登录前请求页
	}
}

25、自定义错误

<system.web>
	<customErrors mode="RemoteOnly"  defaultRedirect="~/error/DefaultError.aspx">
		<error statusCode="404" redirect="~/error/404.aspx" />
		<error statusCode="500" redirect="~/error/500.aspx" />
	</customErrors>
</system.web>

mode
On 启用
Off 禁用
RemoteOnly 只显示给远程访问

26、web.config 配置节

appSettings 应用程序设置
作者、网站图片路径、数据库类型
connectionStrings 连库字符串
连库字符串
自动附加数据库connectionString=“server=。;AttachDbFileName=|DataDirectory|NorthWnd.mdf;uid=sa;pwd="
system.web 配置文件(默认的配置设置)以下所有的代码都应该放入其中
httpRuntime
配置 ASP.NET HTTP 运行库设置
enable 程序启用状态
executionTimeout 程序执行时间上限
maxRequestLength 上传内容最大限制
pages 标识特定于页的配置设置
如是否启用会话状态、视图状态,是否检测用户的输入等
该项默认是检测,如果你使用了不检测,一要对用户的输入进行编码或验证
compilation 是否允许调试
authentication 身份验证
Windows
Form
Passport
None
customErrors
为 ASP.NET 应用程序提供有关自定义错误信息的信息。不适用于 XML Web services 中发生的错误

<configuration>
	<appSettings>
		<add key="author" value="zhlb" />
		<add key="WebRoot" value="/Web/"/>
	</appSettings>
	<connectionStrings>
		<add name="SQLConnString1" connectionString="Server=.;Database=MyBookShop;uid=sa;pwd=" />
	</connectionStrings>
	<system.web>
		<httpRuntime enable="true" executionTimeout="90" maxRequestLength="4096"/>
		<pages validateRequest="false" />
		<compilation debug="true"/>
		<authentication mode="Forms">
		<forms name="book_userName" loginUrl="~/Admin/AdminLogin.aspx" timeout="60">
			<credentials passwordFormat="Clear">
			</credentials>
		</forms>
		</authentication>
		<customErrors mode="RemoteOnly"  defaultRedirect="~/error/DefaultError.aspx">
			<error statusCode="404" redirect="~/error/404.aspx" />
			<error statusCode="500" redirect="~/error/500.aspx" />
		</customErrors>        
	</system.web>
</configuration>

只影响同级与下级,下级有配置文件的适用就近原则

27、machine.config 配置管理

路径,.netframework版本不同则目录不同,以2.0为例
c:\Windwos\Microsof.NET\Framework\v2.0…\CONFIG
Win2003服务器 Framework版本V2.0…
Web站点管理工具
打开:IDE的网站菜单下的ASP.NET配置
4个选项卡:主页、安全、应用程序、提供程序
侵入式
MMC ASP.NET插件
打开:ASP.NET站点属性的编辑配置
非侵入式

28、部署

准备
在web.config中关闭调试功能
使用Release(发行版)的方式编译应用程序
发布预编译站点
又叫部署预编译
选项
允许更新预编译站点
使用固定命名和单页程序集
对预编译程序集启用强命名
本地预编译,打包上传

29、随笔

<%@ 表示:引用
<%= 表示:取值
<%# 表示:绑定
<%= 变量名%>
<%# 要绑定的字段名%> 或者 <%# 调用后台的方法名%>
<%%> <%%>可以加入判断语句或代码
<%$ %>? 这个只能用在取Web.config的连接字符串


  1. 0-9 ↩︎

发布了130 篇原创文章 · 获赞 296 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/zlbdmm/article/details/104629863