以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  [合集] 用好runat="server",分离表示层和逻辑层  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11827)


--  作者: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.  感谢!




上一篇
返回上一页
回到目录
回到页首
下一篇



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms