问题描述
模板页中有个用户自定义控件Top.ascx用来显示导航条继承了模板页后的子页面想传递一个值给Top.ascx,使得Top.ascx自定义控件中的导航获取子页面传递的值显示不同的导航信息。求式例代码?
解决方案
解决方案二:
用强类型的母版页让母版页来提供一个方法来操作就好,母版页其实是内容页的一个控件,没继承关系的
解决方案三:
子页面建立Session在Top.ascx判断session值改变导航信息!
解决方案四:
Referthis:
解决方案五:
其实LZ的主要问题是aspx页面向母版页.master页面的传值,因为再自定义控件中使用控件的属性能很容易进行传值至于aspx与.master之间的传值,看看这篇文章
解决方案六:
想问一下:aspx页面向母版页.master页面的传值,那母版页上的自定义控件Top.ascx后台Footer.ascx.cs如何获得这个值,问题二:我在aspx页上使用this.ContentPlaceHolder1.FindControl("textBox1")这样类似的方法提升找不到ContentPlaceHolder1这个控件一下是代码Top.ascx后台publicpartialclassTop:System.Web.UI.UserControl{privatestringmenu_id="0";publicstringMenu_Id{get{returnmenu_id;}set{menu_id=value;}}protectedvoidPage_Load(objectsender,EventArgse){strings=Menu_Id;Cms.BLL.Linksbll=newCms.BLL.Links();Cms.Model.Linksmodel=newCms.Model.Links();DataSetdt=bll.GetList("IsImage="+Convert.ToInt32(Menu_Id));rptlist1.DataSource=dt.Tables[0].DefaultView;rptlist1.DataBind();}
有自定义控件Top.ascx的母版页前台代码<%@MasterLanguage="C#"AutoEventWireup="true"CodeBehind="Manager.master.cs"Inherits="Cms.Web.Manager"%><%@Registersrc="Controls/Top.ascx"tagname="Top"tagprefix="uc1"%><%@Registersrc="Controls/Footer.ascx"tagname="Footer"tagprefix="uc2"%><formid="form1"runat="server"><!--Logo.Start--><uc1:TopID="Header"runat="server"/><!--Logo.End--><asp:ContentPlaceHolderID="ContentPlaceHolder1"runat="server">内容页</asp:ContentPlaceHolder><!--Footer.Start--><uc2:FooterID="Footer"runat="server"/><!--Footer.Start--></form>
继承了母版页的子页面前台代码<%@PageTitle=""Language="C#"MasterPageFile="~/Manager.Master"AutoEventWireup="true"CodeBehind="About.aspx.cs"Inherits="Cms.Web.About"%><asp:ContentID="Content1"ContentPlaceHolderID="ContentPlaceHolder1"runat="server"></asp:Content>
继承了母版页的子页面后台代码publicintmenu_id;//全局变量IdpublicstringStrTitle="";publicstringStrContent="";protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){Cms.BLL.Contentsbll=newCms.BLL.Contents();Cms.Model.Contentsmodel=bll.GetModel(1);//Session["menu_id"]=1;//Response.Redirect("Top.ascx");//Sessionintid=1;//FindControl("ContentPlaceHolder1")menu_id.ToString()="1";//this.ContentPlaceHolder1.FindControl("Top").StrTitle=model.Title;StrContent=Cms.Common.Utils.ToTxt(model.Content);}
问题三,用session如何向母版页上的自定义控件传值?
解决方案七:
母板页在运行是嵌入内容页的一个用户控件,这其实就跟一个普通的控件的作用是一样的,是用来“屏蔽”内部实现信息的。也就是说,如果你修改母板页的设计(但是Content接口不变),那么你的各种内容页就自动改变了。母板页既然要想维系这种真正的设计目的,就不能去悲催地支持什么外界想当然地去处理其内部的什么子控件这类做法。它一定是是在接口上设计你的“传递一个值”的属性。举个例子,假设我们把这个业务接口预先设计为publicinterfaceI传递组织架构的值{Unitunit{get;set;}}
任何一个控件如果需要外界传递给它组织架构(好在其内部利用这个数据,例如产生顶层菜单),都可以使用这个接口。例如你的母板页可能就是publicpartialclassMyMasterPage:System.Web.UI.MasterPage,I传递组织架构的值{publicUnitunit{get{EnsureChildControls();.......}set{EnsureChildControls();.......}}.......
这样,你的内容页不用等母板页是否做好,就可以按照接口进行编程。例如写Unitdata=BLL.获取顶层组织架构();varmaster=(I传递组织架构的值)this.Master;master.unit=data;
这样就是传递这个值(是一个自定义对象)给母板页。母板页与top.ascx的关系也是如此。你的top.ascx的代码可以使用这个接口,然后由上面的setter方法中直接给它复制。原则是——信息对外是只暴露接口的。top.ascx内部是如何实现的,与母板页无关,母板页不能想当然地去处理top.ascx内部的控件。同样,内容页也不能想当然地去整什么textBox1控件。软件之所以成为工程,是有它的道理的。你把那些垃圾的做法去掉一半,就会顺利地开发下去。反之如果你你没有这些知识,可能很快就陷入到泥沼中,你的代码连自己的懒得维护,更别提原本(内部屏蔽的部分)要快速重构了。
解决方案八:
至于说什么Session集合来临时保存一下数据,这个就很难说它“算是什么”。尽管有不少自学asp.net出身的人这样写代码,但是要知道这是我们懒得去说的一种“毁三观”的习惯造成的。因为Session是会话范畴的机制,而你现在是在讨论一个Page对象内部的整体与局部之间的关系。这就好比如说你写一个代码publicvoid方法1(){varx=......;调用方法2(x);.......}
你现在只想设计方法“内部”的参数传递机制,你因为不知道这个参数x如何定义,有人跟你说“你定义一个privatestatic的全局静态变量来为方法2传递参数,这种“毁三观”的做法在你只会做一点小程序混日子的时候可能觉得“也不错,可以达到效果”。但是它其实理解起来更加诡异,而且很容易就会有严重的问题显现出来。
解决方案九:
楼上的大哥,我就是做个普通的网站,你也看到了,不是什么高端,大气,上档次的大型系统,有时间你就帮忙解决下问题,别在这瞎喷了,任何软件都是要根据需求来定,我这个网站上的导航条,我希望他能根据页面来显示不同的导航信息,比如我进入公司简介,母版页上自定义控件导航就会显示公司简介上的相关目录,如“关于我们”“公司荣誉””联系我们“;当我们进到最新资讯页面,导航条显示”行业动态“,”公司动态“”最新活动“;这本身就是临时数据。