随心所欲

做个幸福的人
posts - 147, comments - 1402, trackbacks - 28, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

MasterPage在asp.net2.0中可以帮助我们构建一个极富扩展性的页面框架结构。
但是使用MasterPage(模版页),并不是说完全可以附加的,几乎不修改自己原来的aspx页面。为了加入模版页,还是要做出一些调整的。

1:相对路径的调整
      原来写代码的时候,并没有注意很多路径的问题,大致也就这么写了
    

 if (this.LoginUser == null && !this.Anonymous)
            Response.Redirect(
"~/Module/User/Login.aspx");
 
     但是如果加上MasterPage,有些写法就要修改成这样了,必须有加上一个url的处理
    string url = String.Format("~/Module/Patterns/EntityPattern.aspx?module={0}", contentName);
            url 
= this.ResolveUrl(url);
不然的话,这个地址很容易出错。

2:this.FindControl
     在原来的aspx页面里面,可以经常这样写代码:this.FindControl(xxx)。但是一旦加入了MasterPage,这样的写法就有了问题:因为这里的“this”意义已经不是从前了,this的第一个对象找到的应该是MasterPage中的控件,而不是aspx中的控件。因为Aspx其实是把内容放在其中一个Content上的子控件上,所以aspx页面只能算作是this的一个子控件。
    但是,由于在asp.net2.0里面可以直接调用userControl的方法(这个识别很有趣),所以用这种方法调用就更方面了
 
 ArrayList choose = this.InfoContentList1.CheckedInfoList;
  其中,InfoContentList1是一个UserControl。

3:事件
    原来的时候,我在aspx页面的OnPreInit事件里写了一些处理,就像这样
  
  protected override void OnPreInit(EventArgs e)
    
{
       }
    有时候为了处理重构,我就在这里加载对象名称。
 
    但是一旦用了MasterPage,这个事件就无效了,而必须使用另外一个事件“OnInit”来代替。不然的话,你什么对象也得不到,全是null。 

   aspx的OnPreInit事件倒是可以用来切换MasterPage( MasterPage的切换

4:AtlasToolkit
    其中的一个控件,就是那个可以产生拖动效果的那个控件DragPanel,只能在MasrerPage中的一个Content上起作用。
   也就是说,只能在你防止Aspx页面的区域才能拖动控件,超出这个区域(进入MasterPage的其他Content)就无效了。
   新版本中倒是还不知道效果如何。

Feedback

#1楼    回复  引用  查看    

2006-07-09 22:38 by 阿不      
关于相对路径的问题,在.NET 下使用最好都使用"~"的方式,保证正确性。

#2楼    回复  引用  查看    

2006-07-10 08:17 by 菌哥      
如果想在Masterpage中插入Flash,那么"~"还有用吗?

#3楼 [楼主]   回复  引用  查看    

2006-07-10 08:17 by 随心所欲      
@阿不
我已经使用了~符号,但是在MasterPage里面还是不能保证正确。
最保险的办法可能就是再加上那一句 url = this.ResolveUrl(url);

#4楼 [楼主]   回复  引用  查看    

2006-07-10 08:22 by 随心所欲      
@菌哥
看你的如何引用了。
如果是完整的url:http://xxx.xxx.xxx/xxx.xxx那就不用了
如果是你本地目录上的,建议还是使用,并且加上 url = this.ResolveUrl(url);

#5楼 [楼主]   回复  引用  查看    

2006-07-10 08:23 by 随心所欲      
url = this.ResolveUrl(url);
里面的this是页面的实例。或者直接用this.Page.ResolveUrl(url);

#6楼    回复  引用  查看    

2006-07-10 11:30 by 阿不      
@随心所欲
我没有出现过相关的问题。但是我有在MasterPage中使用"~/",是可以正常使用的。可以参考:http://hjf1223.cnblogs.com/archive/2006/04/04/366569.html
关键点:如果是在<a>标识中使用"~/"(HTML Control),要给<a>加上runat="server"才会被正常解析。

#7楼 [楼主]   回复  引用  查看    

2006-07-10 11:42 by 随心所欲      
@阿不
可能我使用的情况有些复杂:嵌套的UserControl里面弹出新的窗体。
不过,看来每个地方都加一个.ResolveUrl安全一点,算是加个保险了。

我这里不涉及到<a>标识。

#8楼    回复  引用  查看    

2006-07-10 11:46 by 阿不      
@随心所欲
不只是<a>,所以有的HTML控件使用了"~/",都必须加上Runat="server"

#9楼 [楼主]   回复  引用  查看    

2006-07-10 11:53 by 随心所欲      
@阿不
我用了window.open(''),这个应该没关系吧。

不过你说的这个问题可能是存在的。因为~是定义根目录的意思,如果不是服务器端控件是无法识别这个符号的。

另外,这个~也是可以修改成其他符号的,比方说“@”什么的。~是默认的。

#10楼 [楼主]   回复  引用  查看    

2006-07-10 13:04 by 随心所欲      
@阿不
找到了,应该是这个属性
UserControl.AppRelativeTemplateSourceDirectory
这个可以设置根目录的符号,默认是“~”,但是可以改成其他的。
好像是这样的,我以前一个项目好像就是这么处理的。

#11楼    回复  引用  查看    

2006-07-10 13:47 by Nina      
我反正是對master很不滿意。還是喜歡2003的框架,起碼meau和主內容是分開的,這樣比較好操作

#12楼 [楼主]   回复  引用  查看    

2006-07-10 14:10 by 随心所欲      
@Nina
2005里面不是分开的么?并且还能自动感知吧。

#13楼    回复  引用    

2006-07-30 08:24 by shanyuefeng [未注册用户]
我在MasterPage的HTML控件使用了"~/",引用图片和背景,在MasterPage中不能显示,而在引用MasterPage的.aspx文件中却可以显示!

#14楼 [楼主]   回复  引用  查看    

2006-11-30 17:49 by 随心所欲      
@shanyuefeng
becuse the masterpage do not have a path.
the masterpage have the same path to the page that use it.





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-07-12 15:33 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:
 
Google