【问题标题】:ASP.Net Code Behind design设计背后的 ASP.Net 代码
【发布时间】:2010-12-14 05:16:20
【问题描述】:

我正在创建一个包含多个 .aspx 页面的小型 asp.net 应用程序。 我不确定在 (c#) 后面设计代码的方式。

示例: 让我有一个网页,可以从数据库加载书籍并将它们的名字放在 HTML 列表中。 我背后的代码需要: 1)

  1. 从 DB 中获取图书数据。
  2. 创建 HTML 列表
  3. 将列表放入页面源中。

我发现的一种简单方法是:

  1. 从数据库加载数据和格式化的类
  2. 从对象创建 HTML 字符串的 HtmlFactory 类
  3. 简单的属性绑定,将生成的 HTML 代码放入页面中

我想有更清洁的方法来完成上述操作。 我知道 MVC,但我想还有更多用于设计代码的模型。

请描述您对以上内容的使用方式或链接到相关数据。

【问题讨论】:

    标签: asp.net code-behind


    【解决方案1】:

    ASP.Net 带有许多控件,可以轻松处理数据。对于您提供的示例,我将考虑使用 Repeater 控件轻松地将您从数据库中获取的书籍列表绑定到您的页面。其他数据绑定控件包括:

    • 网格视图
    • 列表视图
    • 详情查看
    • 表单视图
    • 数据列表

    所有这些都使您可以轻松地将数据绑定到您的页面。

    最好的办法是通过分离功能来分层您的应用程序,例如。业务层、数据访问层、表示层等。我一直在推荐的一系列优秀文章是 Imar Spaanjar 在Building a N-Layer Application 上的文章。

    我已经有一段时间没有访问他的博客了,但您可能还会找到一组类似的 MVC 文章,但我不确定。

    【讨论】:

      【解决方案2】:

      如果您使用的是标准 Web 窗体 ASP.Net(即不是 MVC),我将使用 ListView 控件来描述您所描述的内容。这个想法是您指定一个 LayoutTemplate 和一个 ItemTemplate,并将数据绑定到您的列表。

      我会尽量避免将 HTML 构建为大量的长字符串并将其注入您的页面,当它不可避免地中断时,调试这种东西并不好玩,而且它很可能是一个性能狗。 ASP.Net Controls 正是为了实现这一目标,并受益于数千/数百万工时的开发和测试。

      我的经验法则是 HTML 是由为此目的而设计的控件生成的,而代码隐藏只是用于设置这些控件的属性。

      一般而言,就您所描述的而言,我会使用 LinqToSql 或更可能的 Entity Framework 来包装我的数据库访问。根据项目的复杂性,我可能会将其抽象到存储库后面,但前提是它值得这样做。 Linq/EF 上下文表示您描述为 (1) 的内容,即仅负责数据库访问的单个类。

      然后我会在页面中使用 ListView 控件,并在页面加载时绑定它。

      例如:

      <!-- rest of page -->
      <asp:ListView ID="ListView_Books" runat="server" ItemPlaceholderID="itemPlaceholder">
         <LayoutTemplate>
            <ul>
               <asp:Placeholder ID="itemPlaceholder" runat="server" />
            </ul>
         </LayoutTemplate>
         <ItemTemplate>
            <li>
               <%# DataItem.Title %>, by <%# DataItem.Author %>
            </li>
         </ItemTemplate>
      </asp:ListView>
      <!-- rest of page -->
      

      我的代码后面会有类似 (VB) 的东西:

      Protected Sub Page_Load()
         ListView_Books_Bind()
      End Sub
      
      Protected Sub ListView_Books_Bind()
         Dim dataContext As New MyDataContextClass
         ListView_Books.DataSource = dataContext.Books
         ListView_Books.DataBind()
      End Sub
      
      Protected Readonly Property DataItem As Book
         Get
            Return DirectCast(Page.GetDataItem(), Book)
         End Get
      End Property
      

      编辑 - 合并 Pauli 的评论 - 谢谢!

      【讨论】:

      • 说到性能,使用 Eval 是邪恶的,因为它执行运行时绑定。始终转换为正确的类型并直接访问属性:)
      • , by
      • 菲尔,我们可能对意大利面条编码有不同的解释?这只是注入一个评估值。使用默认视图引擎的整个 ASP.Net MVC 框架都建立在该语法之上。对我来说,意大利面条式编码是将后面代码中的内容与页面内容交织在一起,即将代码的不同目的纠缠在一起。如果您有可以发布的更清洁的替代方案,是否有兴趣查看?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2010-12-14
      • 2014-03-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多