如何在ASP.NET中使用C#从母版页切换指定内容页
从母版页切换到指定内容页的实现方案
方法1:直接跳转到支持搜索的目标页面
这是最直接的解决方式,毕竟你的核心需求就是回到能正常使用搜索的页面,直接导航过去就行。把注释部分的代码替换成以下内容:
protected void btn_search_Click(object sender, ImageClickEventArgs e) { string pageName = this.ContentPlaceHolder1.Page.GetType().FullName; if (pageName != "ASP.ChinaShipManagerHome_aspx") { // 跳转到支持搜索的首页 Response.Redirect("~/ChinaShipManagerHome.aspx"); } }
Response.Redirect会让浏览器直接跳转到目标页面,此时母版页会自动和该内容页结合,自然就能使用搜索功能。如果需要保留当前页面的查询参数,或者不想让浏览器地址栏变化,可以换成Server.Transfer("~/ChinaShipManagerHome.aspx")(这是服务器端跳转,地址栏不会更新)。
方法2:不跳转页面,动态替换ContentPlaceHolder内容
要是不想跳转页面,只想把当前内容页的内容换成搜索相关部分,可以按以下步骤操作:
第一步:封装搜索模块为用户控件
先把ChinaShipManagerHome.aspx里和搜索相关的内容拆出来,做成一个用户控件(比如命名为SearchPanel.ascx),这样能复用代码,避免重复编写。
第二步:在母版页按钮事件中动态加载控件
protected void btn_search_Click(object sender, ImageClickEventArgs e) { string pageName = this.ContentPlaceHolder1.Page.GetType().FullName; if (pageName != "ASP.ChinaShipManagerHome_aspx") { // 清空当前ContentPlaceHolder里的内容 ContentPlaceHolder1.Controls.Clear(); // 加载搜索控件并添加到容器中 Control searchControl = LoadControl("~/SearchPanel.ascx"); ContentPlaceHolder1.Controls.Add(searchControl); } }
这段代码会先清空ContentPlaceHolder1里的现有内容,再把封装好的搜索控件加载进去,当前页面就会显示搜索相关内容了。
小优化建议
你现在用硬编码的页面类名做判断,后续新增支持搜索的页面时,还要修改这里的代码,不够灵活。可以给所有支持搜索的页面添加一个标记接口:
public interface ISearchEnabledPage { }
然后让ChinaShipManagerHome.aspx实现这个接口:
public partial class ChinaShipManagerHome : Page, ISearchEnabledPage { // 页面原有代码 }
之后母版页里的判断逻辑可以改成:
if (!(this.ContentPlaceHolder1.Page is ISearchEnabledPage)) { // 执行跳转或替换操作 }
这样以后新增支持搜索的页面,只要实现这个接口就行,不用修改母版页的代码。
内容的提问来源于stack exchange,提问作者Robert Koernke
相关产品推荐
相关产品推荐

