asp.net tips汇总
1. 实用、简单的URL重写
< system.web >
< urlMappings enabled ="True">
< add url ="~/guid.html" mappedUrl ="guid_{492f3e0b-848e-11da-9550-00e08161165f}.html"/>
</ urlMappings >
< /system.web>
url为客户端看到的url,mappedUrl为实际的Url
2.页面之间传值使用
Page.PreviousPage 属性,获取向当前页传输控件的页。 找到相应的控件
eg: TextBox t = ((TextBox)(PreviousPage.FindControl("Textbox1")));
Calendar c = ((Calendar)(PreviousPage.FindControl("Calendar1")));
Textbox1为前一个页面的控件。
3.利用JavaScript选择GridView行
第一步:在页面中添加GridView控件和一个按钮,隐藏字段
< input id ="hdnEmailID" type ="hidden" value ="0" runat ="server" name ="hdnEmailID" /> < asp : GridView ID ="gvUsers" runat ="server" AutoGenerateColumns ="False" OnRowDataBound ="gvUsers_RowDataBound"> < Columns > < asp : BoundField DataField ="Email" HeaderText ="邮件" ReadOnly ="True" /> < asp : BoundField DataField ="Name" HeaderText ="姓名" ReadOnly ="True" /> </ Columns > </ asp : GridView > < asp : Button ID ="btnSelect" runat ="server" OnClick ="btnSelect_Click" Text ="Select" />
第二步:编写JS函数来获取选择行的id,并改变背景颜色
<
script
language
="javascript"
type
="text/javascript">
var lastRowSelected;
var originalColor;
function GridView_selectRow(row, EmailID)
{
var hdn=document.form1.hdnEmailID;
hdn.value = EmailID;
if (lastRowSelected != row)
{
if (lastRowSelected != null)
{
lastRowSelected.style.backgroundColor = originalColor;
lastRowSelected.style.color = 'Black'
lastRowSelected.style.fontWeight = 'normal';
}
originalColor = row.style.backgroundColor
row.style.backgroundColor = 'BLACK'
row.style.color = 'White'
row.style.fontWeight = 'normal'
lastRowSelected = row;
}
}
function GridView_mouseHover(row)
{
row.style.cursor = 'hand';
}
</
script
>
略过一步,就是绑定数据,大家自行完成。
第三步:在RowDataBound事件中添加JS函数调用。
protected void gvUsers_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.ID = e.Row.Cells[0].Text; e.Row.Attributes.Add("onclick", "GridView_selectRow(this,'" + e.Row.Cells[0].Text + "')"); e.Row.Attributes.Add("onmouseover", "GridView_mouseHover(this)"); } }
第四步:完成按钮事件
在选择/删除按钮单击事件我们可以用hdnEmailID.Value方式获得行的id。然后利用id来完成操作;这里为了演示,我只是输出了这个值。
protected void btnSelect_Click(object sender, EventArgs e) { Response.Write(hdnEmailID.Value); } 4. ASP.NET AJAX 中,如何用 JavaScript 调用服务器端的方法?
这里不是指调用简单的 PageMethod,因为静态方法是不能操作当前页面的控件的,所以静态的 PageMethod 作用就跟普通的 WebService 一样,比较局限。
那么,调用一般的服务器端方法,其实就是发起一个异步回调。最简单的实现办法,是通过 UpdatePanel 来做。
首先定义一个隐藏的 LinkButton,在其处理事件中,去调用我们要执行的操作:
< asp:LinkButton ID ="linkUpdatePosts" runat ="server" style ="display:'none';" OnClick ="linkUpdatePosts_Clicked" />
// 刷新帖子列表(供客户端 js 调用)
protected void linkUpdatePosts_Clicked( object sender, EventArgs e)
{
LoadPosts();
}
protected void linkUpdatePosts_Clicked( object sender, EventArgs e)
{
LoadPosts();
}
然后 JavaScript 中就可以定义函数来触发这个 LinkButton 的回发:
// 刷新帖子列表
function refreshPosts() {
__doPostBack( ' <%= linkUpdatePosts.UniqueID %> ' , '' );
}
function refreshPosts() {
__doPostBack( ' <%= linkUpdatePosts.UniqueID %> ' , '' );
}
function refreshPosts() {
__doPostBack('<%= linkUpdatePosts.ClientID %>'.split('_').join('$'), '');
}
这里注意 split('_').join('$') 的用法,是因为作为 __doPostBack 参数的控件标志符是用 $ 分隔的,而 ClientID 是用 _ 分隔,要在两者之间进行下转换。
5. 如何获取 GridView 编辑状态下单元格里的值?
还在使用这样的代码吗?
var txtName = grid1.Rows[e.RowIndex].Cells[ 0 ].FindControl( " txtName " ) as TextBox;
if (txtName != null )
{
// 读取值
//
}
if (txtName != null )
{
// 读取值
//
}
其实这些工作(在单元格中查找控件,并尝试获取其中的值)已经被封装了。现在,只要调用 ExtractValuesFromCell 方法即可。
而该方法也被很多种列类型所支持:
DataControlField, BoundField, AutoGeneratedField, CheckBoxField, ImageField, TemplateField, DynamicField
你可以在 GridView 的 RowUpdating, RowDeleting 等事件中使用它。利用该方法,可以将值提取到所需的字典里去,然后再从字典中读取。这些字典包括:e.Keys, e.NewValues, e.OldValues 等。
一小段例子代码:
// 更新
protected void grid1_RowUpdating( object sender, GridViewUpdateEventArgs e)
{
var row = grid1.Rows[e.RowIndex];
// 提取 Id 字段的值
grid1.Columns[ 0 ].ExtractValuesFromCell(
e.Keys,
row.Cells[ 0 ] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */ );
// 提取 Name 字段的值
grid1.Columns[ 1 ].ExtractValuesFromCell(
e.NewValues,
row.Cells[ 1 ] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */ );
var id = int .Parse(e.Keys[ " id " ].ToString());
var name = ( string ) e.NewValues[ " name " ];
// 执行相关的数据库更新操作
//
}
protected void grid1_RowUpdating( object sender, GridViewUpdateEventArgs e)
{
var row = grid1.Rows[e.RowIndex];
// 提取 Id 字段的值
grid1.Columns[ 0 ].ExtractValuesFromCell(
e.Keys,
row.Cells[ 0 ] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */ );
// 提取 Name 字段的值
grid1.Columns[ 1 ].ExtractValuesFromCell(
e.NewValues,
row.Cells[ 1 ] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */ );
var id = int .Parse(e.Keys[ " id " ].ToString());
var name = ( string ) e.NewValues[ " name " ];
// 执行相关的数据库更新操作
//
}
这样,在大多数场合我们可以尽可能多的使用 BoundField,并且也能正确读取到其编辑时的值,省下自定义 TemplateField 的一堆代码了。 1. 如何让页面回发(PostBack)后,滚动条位置保持不变?
在页面后台代码的Page_Load事件中,添加如下代码:
this.Page.MaintainScrollPositionOnPostBack = true;
上面的代码在.net1.1中等价于
this.Page.SmartNavigation = true;
2. 如何在IE中让文本框刷新之后还保持原值
<HTML>
<HEAD>
<META NAME="save" CONTENT="history">
<STYLE>
.saveHistory {behavior:url(#default#savehistory);}
</STYLE>
</HEAD>
<BODY>
<INPUT class=saveHistory type=text id=oPersistInput>
</BODY>
</HTML>
<HEAD>
<META NAME="save" CONTENT="history">
<STYLE>
.saveHistory {behavior:url(#default#savehistory);}
</STYLE>
</HEAD>
<BODY>
<INPUT class=saveHistory type=text id=oPersistInput>
</BODY>
</HTML>
posted on 2008-10-08 22:12 Love Fendi 阅读(267) 评论(0) 编辑 收藏 举报