大家好,又见面了,我是你们的朋友全栈君。
ASP.NET知识点总结
- 1、ASP.Net的特色与优势
- 2、几对概念
- 3、解决方案构成
- 4、系统对象与状态管理
- 5、控件的分类
- 6、站点地图
- 7、系统导航
- 8、母版页
- 9、系统框架
- 10、数据绑定
- 11、数据源控件
- 12、数据绑定控件
- 13、数据验证控件
- 14、文件上载
- 15、其他服务器控件
- 16、基于SQL语句分页
- 17、DataList 分页
- 18、RSS发布
- 19、数据展示控件的主要用途
- 20、小技巧
- 21、第三方控件
- 22、用户控件
- 23、ASP.NET处理Http请求的两个核心机制
- 24、数据库连接字符串加密、解密
- 25、自定义错误
- 26、web.config 配置节
- 27、machine.config 配置管理
- 28、部署
- 29、随笔
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的连接字符串
-
0-9 ↩︎
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157503.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...