-- 作者:admin
-- 发布时间:11/9/2004 2:26:00 AM
-- [合集] 用好runat="server",分离表示层和逻辑层
发信人: Nineteen (-_-#!), 信区: DotNET 标 题: [合集] 用好runat="server",分离表示层和逻辑层 发信站: BBS 水木清华站 (Sat Dec 20 17:53:15 2003), 站内 ☆─────────────────────────────────────☆ wesley (pine~心中的森林) 于 (Sat Apr 27 13:24:09 2002) 提到: 最好不要用asp的方法来套asp.net,应该尽可能避免在aspx页面里出现<% %>块, 因为 迄今为止我发现都可以在code behind中解决,有的时候你会在服务器端找不到个 aspx 页面中定义好的server side controle,那就应该看看code behind里面是否在 webform类里声明了一个protected的同样名字的属性,如果没有就手动加上,这可能是一 个无伤大雅的小bug。 更多的时候,可以很灵活的利用runat="server"来定义更多的控件,比如将body设成 <body id="myBody" runat="server"> 然后在code behind里加上myBody的属性,就可以在Page_Load里面自定义body的一些 属性和样式了,这比在aspx页面中用<%= %>来定制漂亮得多,更重要得是,当你得程序 自定义度得要求很高得时候,在代码中很容完成的运行时determine的数据赋值,在 页面中用老的<% %>文法是很难实现的,即使能够实现也很ugly。 想想JSP页面中的jsp tag library,一个好的JSP页面应该也不出现任何<% %>文法, 而应该把所有的服务器端的脚本写在tag library里面。 ms给我们提供了webform。比起taglib更加方便和容易,我们可以好好发挥一下webform 在分离表示层和逻辑层上提供的天然机制,用好runat="server" ☆─────────────────────────────────────☆ phanx (向右走) 于 (Sat Dec 20 01:43:06 2003) 提到: 小弟初学ASP.net有个问题 如果我要实现类似 <img src="/xxxx/<%=style%>/1.png" />这样的效果, 并且一个 aspx中有很多的<img>,应该怎么办呢? 在 code behind 中应该怎么解决? 【 在 wesley (pine~心中的森林) 的大作中提到: 】 ∶最好不要用asp的方法来套asp.net,应该尽可能避免在aspx页面里出现<% %>块, ∶因为 ∶迄今为止我发现都可以在code behind中解决,有的时候你会在服务器端找不到个 ∶aspx ∶页面中定义好的server side controle,那就应该看看code behind里面是否在 ∶webform类里声明了一个protected的同样名字的属性,如果没有就手动加上,这可能是一 ∶个无伤大雅的小bug。 ∶更多的时候,可以很灵活的利用runat="server"来定义更多的控件,比如将body设成 ∶<body id="myBody" runat="server"> ∶然后在code behind里加上myBody的属性,就可以在Page_Load里面自定义body的一些 ∶属性和样式了,这比在aspx页面中用<%= %>来定制漂亮得多,更重要得是,当你得程序 ∶................... ☆─────────────────────────────────────☆ wesley (心中的森林) 于 (Sat Dec 20 08:45:04 2003) 提到: 在一个工具类(例如叫HtmlUtil,声明为sealed,并且成员全是静态的)中声明如下方法 public static string GenImgHtmlTag(string url, string alt) { return "<img width=120 height=90 src='" + url + "' alt='" + alt + "'>"; } 然后在你generate页面的过程中,例如,要把这个写到一个table cell(<TD>)里边, 可以这么写: TableRow oRow= new TableRow(); oCell = new TableCell(); oCell.Text = HtmlUtil.GenImgHtmlTag(url, alt); oRow.Cells.Add(oCell); MyTable.Rows.Add(oRow); 其中MyTable是一个页面中设定好的RunAt="server"的 System.Web.UI.WebControls.Table 对象,并且在你的页面inherits的class定义里边有如下的声明: protected System.Web.UI.WebControls.Table MyTable; 所有的动态内容都可以通过将页面中的控件设置成runAt="server",然后在页面interits 的class里边操纵其内容。 【 在 phanx (向右走) 的大作中提到: 】 ∶小弟初学ASP.net有个问题 ∶如果我要实现类似 <img src="/xxxx/<%=style%>/1.png" />这样的效果, ∶并且一个 aspx中有很多的<img>,应该怎么办呢? ∶在 code behind 中应该怎么解决? ☆─────────────────────────────────────☆ phanx (向右走) 于 (Sat Dec 20 09:46:14 2003) 提到: 非常感谢您的解答. 可能我没有表述好我的问题. 我的情况是这样. 当页面制作人员用 fireworks生成了一个页面, 其中包含了大量的 <img>标签,而且src都是自动生成的切片.像这样. <tr> <td width="187"><img src="./style/<%=style%>/images/hr_3_left_r1_c1.jpg" width="188" height="35"></td> <td><img src="./style/<%=style%>/images/hr_3_left_r1_c3.jpg" width="21" height="35"></td> </tr> 我在程序中无法对 hr_3_left_r1_c1.jpg 这样的url进行预测,只能负责决定 string style 的值. 而且如果是大量的 <img>标签,每个标签都用 GenImgHtmlTag() 来生成的话,恐怕 效率也不高. 我希望的效果是在 Code behide 中决定了 style 的值,然后在 aspx 中输出,就像在 ASP中用 <%=style%> 一样,只要上面给 style 赋了值,下面就可以输出. 所以我想知道在 code behide 中能不能实现,应该怎么操作? 再次感谢. 【 在 wesley (心中的森林) 的大作中提到: 】 ∶在一个工具类(例如叫HtmlUtil,声明为sealed,并且成员全是静态的)中声明如下方法 ∶public static string GenImgHtmlTag(string url, string alt) ∶{ ∶return "<img width=120 height=90 src='" + url + "' alt='" + alt + "'>"; ∶} ∶然后在你generate页面的过程中,例如,要把这个写到一个table cell(<TD>)里边, ∶可以这么写: ∶TableRow oRow= new TableRow(); ∶oCell = new TableCell(); ∶oCell.Text = HtmlUtil.GenImgHtmlTag(url, alt); ∶oRow.Cells.Add(oCell); ∶................... ☆─────────────────────────────────────☆ wesley (心中的森林) 于 (Sat Dec 20 10:08:48 2003) 提到: 这种情况嘛,要么就忍受混杂,要么统统在code_behind里边实现,包括那些 hr_3_left_r1_c1.jpg 之类的文件名,既然你可以写在.aspx文件里边,自然也可以 通过Response.Write写在.aspx.cs/.aspx.vb文件里边嘛。:) 【 在 phanx (向右走) 的大作中提到: 】 ∶非常感谢您的解答. 可能我没有表述好我的问题. ∶我的情况是这样. 当页面制作人员用 fireworks生成了一个页面, ∶其中包含了大量的 <img>标签,而且src都是自动生成的切片.像这样. ∶<tr> ∶<td width="187"><img src="./style/<%=style%>/images/hr_3_left_r1_c1.jpg" width="188" height="35"></td> ∶<td><img src="./style/<%=style%>/images/hr_3_left_r1_c3.jpg" width="21" height="35"></td> ∶</tr> ∶我在程序中无法对 hr_3_left_r1_c1.jpg 这样的url进行预测,只能负责决定 ∶string style 的值. ∶而且如果是大量的 <img>标签,每个标签都用 GenImgHtmlTag() 来生成的话,恐怕 ∶效率也不高. ∶................... ☆─────────────────────────────────────☆ phanx (向右走) 于 (Sat Dec 20 10:49:31 2003) 提到: 我想了个笨办法,在 code behide 中利用 session . using System; using System.Web.UI; using System.Web.UI.WebControls; using DataLayer; public class MyDetailPage : Page { protected DataGrid MyDataGrid; protected Label style1; protected void Page_Load(Object sender, EventArgs E) { if (!IsPostBack) { if( Session["style"] == null ) { Session["style"] = "default"; } style1.Text = Session["style"].ToString(); string style = Session["style"].ToString(); //BusObj bus = new BusinessLayer.BusObj(); DataObj data = new DataObj("server=(local)\\NetSDK; database=foo;Trusted_Connection=yes"); MyDataGrid.DataSource=data.GetDetail(1); MyDataGrid.DataBind(); } } // end Page_Load() } 然后在 aspx 中用一个 string 来保存 session <%@ Page Language="C#" Codebehind="detailpage.cs" Inherits="MyDetailPage" EnableSessionState=true Debug=true Trace=true %> <% string style = Session["style"].ToString(); %> <asp:DataGrid id="MyDataGrid" runat="server" Width="700" BackColor="#ccccff" BorderColor="black" ShowFooter="false" CellPadding="3" CellSpacing="0" Font-Name="Courier" Font-Size="9pt" HeaderStyle-BackColor="#aaaadd" EnableViewState="false" /> <asp:label id="style1" runat="server"/> <div align="center"> <table width="778" border="0" cellspacing="1" cellpadding="0"> <tr> <td> <img src="./style/<%=style%>/images/temp_head.jpg" width="778" height="105"> </td> </tr> </table> <table width="778" border="0" cellpadding="0" cellspacing="0" class="index"> <tr> <td width="69"> <img src="./style/<%=style%>/images/hr_2_left.jpg" width="69" height="28"> </td> <td width="150" class="bg"> 这样做可能很不规范,不知大家还有没有别的办法? 【 在 wesley (心中的森林) 的大作中提到: 】 ∶这种情况嘛,要么就忍受混杂,要么统统在code_behind里边实现,包括那些 ∶hr_3_left_r1_c1.jpg 之类的文件名,既然你可以写在.aspx文件里边,自然也可以 ∶通过Response.Write写在.aspx.cs/.aspx.vb文件里边嘛。:) ☆─────────────────────────────────────☆ wesley (心中的森林) 于 (Sat Dec 20 10:54:01 2003) 提到: 1. 能不用session就不用。 2. 能不用<% %>就不用。 你把的所有的html代码移到cs文件的Page_Load里边Response.Write是一种办法。 好办法就是,把 <table width="778" border="0" cellspacing="1" cellpadding="0"> 改成 <table width="778" border="0" cellspacing="1" cellpadding="0" ID="MyImageTable" runat="server"> 然后在Page_Load里边给MyImageTable动态添加row和cell,就如同我前面一篇文章里边的 那段代码那样: TableRow oRow; TableCell oCell; foreach (string url in myUrlCollection) { oRow= new TableRow(); oCell = new TableCell(); oCell.Text = GenImgHtmlTag(url, alt); oRow.Cells.Add(oCell); //为该row添加其他cell MyImageTable.Rows.Add(oRow); } 【 在 phanx (向右走) 的大作中提到: 】 ∶我想了个笨办法,在 code behide 中利用 session . ∶using System; ∶using System.Web.UI; ∶using System.Web.UI.WebControls; ∶using DataLayer; ∶public class MyDetailPage : Page ∶{ ∶protected DataGrid MyDataGrid; ∶protected Label style1; ∶protected void Page_Load(Object sender, EventArgs E) ∶{ ∶................... ☆─────────────────────────────────────☆ phanx (向右走) 于 (Sat Dec 20 11:07:24 2003) 提到: 呵呵,很多 ASP.net 的书籍也是这么说. 小弟愚笨,我是从 PHP平台迁移到.net的,平常 session用惯了, 现在做的是一个具有较复杂外观的Web,而且要实现不同的样式,所以我采用了 session来 保存用户选择的样式. 不同的style值对应着不同的目录名字,目录下存放着不同样式的 图片. 通过 <img src="/images/<%=style%>/foo.jpg" /> 这样的方式来实现更换样式. 而且存在大量的 <img> ,我想如果全部放到 cs 的Page_Load()里面实现的话, 用 MVC 模型也就没有意义了.就像传统的 perl /cgi模式了. 如果使用了 <% %> 就有较大的灵活性. 同时也实现了 页面代码的基本分离. 以上个人愚见,大家见笑了.欢迎批评指正. 【 在 wesley (心中的森林) 的大作中提到: 】 ∶1. 能不用session就不用。 ∶2. 能不用<% %>就不用。 ∶你把的所有的html代码移到cs文件的Page_Load里边Response.Write也不尝是一种办法。 ☆─────────────────────────────────────☆ wesley (心中的森林) 于 (Sat Dec 20 11:11:07 2003) 提到: 你下载一个我写的 Mindsware DataObjects & DynamicDataSheet 去研究一下吧, 里边你需要用到的绝大多数技巧和实现都有实现。 包括你说的对于style的处理,可以切换不同的style,并且按用户将当前用户 选择的style保存在session中。 【 在 phanx (向右走) 的大作中提到: 】 ∶呵呵,很多 ASP.net 的书籍也是这么说. ∶小弟愚笨,我是从 PHP平台迁移到.net的,平常 session用惯了, ∶现在做的是一个具有较复杂外观的Web,而且要实现不同的样式,所以我采用了 session来 ∶保存用户选择的样式. 不同的style值对应着不同的目录名字,目录下存放着不同样式的 ∶图片. 通过 <img src="/images/<%=style%>/foo.jpg" /> 这样的方式来实现更换样式. ∶而且存在大量的 <img> ,我想如果全部放到 cs 的Page_Load()里面实现的话, ∶用 MVC 模型也就没有意义了.就像传统的 perl /cgi模式了. ∶如果使用了 <% %> 就有较大的灵活性. 同时也实现了 页面代码的基本分离. ∶以上个人愚见,大家见笑了.欢迎批评指正. ☆─────────────────────────────────────☆ phanx (向右走) 于 (Sat Dec 20 11:14:48 2003) 提到: 不胜感激,以后还要向老兄学习和请教,先谢谢了. //bow 【 在 wesley (心中的森林) 的大作中提到: 】 ∶你下载一个我写的 Mindsware DataObjects & DynamicDataSheet 去研究一下吧, ∶里边你需要用到的绝大多数技巧和实现都有实现。 ∶包括你说的对于style的处理,可以切换不同的style,并且按用户将当前用户 ∶选择的style保存在session中。 ☆─────────────────────────────────────☆ wesley (心中的森林) 于 (Sat Dec 20 11:15:23 2003) 提到: 【 在 phanx (向右走) 的大作中提到: 】 ∶呵呵,很多 ASP.net 的书籍也是这么说. ∶小弟愚笨,我是从 PHP平台迁移到.net的,平常 session用惯了, ∶现在做的是一个具有较复杂外观的Web,而且要实现不同的样式,所以我采用了 session来 ∶保存用户选择的样式. 不同的style值对应着不同的目录名字,目录下存放着不同样式的 ∶图片. 通过 <img src="/images/<%=style%>/foo.jpg" /> 这样的方式来实现更换样式. ∶而且存在大量的 <img> ,我想如果全部放到 cs 的Page_Load()里面实现的话, ∶用 MVC 模型也就没有意义了.就像传统的 perl /cgi模式了. 这个完全没道理,我看过的java MVC模型的页面实现都很少用<% %>,基本都用 自定义jsp tag来实现页面逻辑和商业逻辑相分离。 ∶如果使用了 <% %> 就有较大的灵活性. 同时也实现了 页面代码的基本分离. 灵活性有了,可维护性就泡汤了。 ∶以上个人愚见,大家见笑了.欢迎批评指正. ☆─────────────────────────────────────☆ phanx (向右走) 于 (Sat Dec 20 11:20:19 2003) 提到: 说实话,在下对于 MVC 模式的理解还不够清晰,因为以前一直是处于 web script 模式下的混杂情况,现在迁移到 ASp.net平台以后很多东西受到以前的定式都不知 无从下手,应该好好理一下了. 谢谢 :) 【 在 wesley (心中的森林) 的大作中提到: 】 ∶这个完全没道理,我看过的java MVC模型的页面实现都很少用<% %>,基本都用 ∶自定义jsp tag来实现页面逻辑和商业逻辑相分离。 ∶灵活性有了,可维护性就泡汤了。 ☆─────────────────────────────────────☆ wesley (心中的森林) 于 (Sat Dec 20 11:21:47 2003) 提到: 强烈建议你下载一个我写的组件回去研究一下,如果用好了,节省你30%以上的工作量。 【 在 phanx (向右走) 的大作中提到: 】 ∶说实话,在下对于 MVC 模式的理解还不够清晰,因为以前一直是处于 web script ∶模式下的混杂情况,现在迁移到 ASp.net平台以后很多东西受到以前的定式都不知 ∶无从下手,应该好好理一下了. 谢谢 :) ☆─────────────────────────────────────☆ phanx (向右走) 于 (Sat Dec 20 11:24:15 2003) 提到: 呵呵, 正在看 readme. 感谢! 【 在 wesley (心中的森林) 的大作中提到: 】 ∶强烈建议你下载一个我写的组件回去研究一下,如果用好了,节省你30%以上的工作量。 ☆─────────────────────────────────────☆ wesley (心中的森林) 于 (Sat Dec 20 11:47:40 2003) 提到: ∶) 多提建议啊,我好持续改进,当然现在的版本已经达到不错的应用标准了:) 【 在 phanx (向右走) 的大作中提到: 】 ∶呵呵, 正在看 readme. 感谢! 上一篇 返回上一页 回到目录 回到页首 下一篇
|