【问题标题】:Share Code Between Web Forms in VB.NET Web Application在 VB.NET Web 应用程序中的 Web 窗体之间共享代码
【发布时间】:2020-03-12 16:59:10
【问题描述】:

希望有人能提出一种在网站应用程序的页面之间共享网络表单代码的更好方法。使用一个非常基本的示例来解释,假设我有两个名为“Page1.aspx”和“Page2.aspx”的网页,它们都有分别名为“Page1.aspx.vb”和“Page2.aspx.vb”的页面背后的代码。

两个页面都有一个执行相同操作的简单按钮对象。通常,您只需在两个页面的代码中添加点击事件,但我想做的是让它在共享的公共类中放置一次。

两个页面的 HTML:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Page1.aspx.vb" Inherits="Page1" %>
<html>
<head runat="server"></head>
<body>
    <form id="Form1" runat="server">
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Page2.aspx.vb" Inherits="Page2" %>
<html>
<head runat="server"></head>
<body>
    <form id="Form1" runat="server">
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>

代码:

Partial Class Page1
    Inherits System.Web.UI.Page
    'I don't want to put the button click event here. How do I reference it from below?
End Class

Partial Class Page2
    Inherits System.Web.UI.Page
    'I don't want to put the button click event here. How do I reference it from below?
End Class

Public Class SharedCode
    Inherits System.Web.UI.Page

    'I want to put the button click event here.
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Response.Write("hello")
    End Sub
End Class

请注意,按钮和按钮的代码完全相同。能够将代码保存在一个地方会很好,这样您就不必一遍又一遍地重复代码以及单独管理它。尤其是在页面很多的情况下。

我使用的一种有效的方法是只在两个页面共享的页面后面使用一个代码:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="SharedCode.vb" Inherits="SharedCode" %>

上面,对于“Page1.aspx”和“Page2.aspx”,我没有使用不同的/特定的“CodeFile”和“Inherits”值,而是使用相同的页面代码。然后,对于特定于这些页面的代码,我在每个页面中添加内联 &lt;script runat="server"&gt; 标记。

同样,这种方法有效,但有更好的方法吗?

【问题讨论】:

    标签: asp.net vb.net webforms visual-studio-2017


    【解决方案1】:

    欢迎来到分层应用程序设计。

    前言

    ASP.NET Web 窗体和 Visual Studio 使创建应用程序变得异常简单,只需将控件拖放到 HTML 设计器上即可。伴随页面,代码隐藏文件包含应用程序的所有事件处理、数据访问和业务逻辑。这种方法的问题是所有关注点都混合在一起,导致测试出现问题并导致业务逻辑重复,因为难以重用本质上与特定视图(ASPX 页面)相关的逻辑.有时这称为智能 UI 反模式

    分离您的顾虑

    Smart UI 反模式的解药是分层应用程序的概念。分层应用程序是关注点分离的一种形式,可以通过命名空间、文件夹或单独的项目来实现。以下是最低限度且过于简化,但您明白了:

    1. 在 Visual Studio 中创建一个新的空白解决方案并将其命名为 MyWebSite
    2. 通过右键单击解决方案名称并选择添加 > 新项目,将新的类库项目添加到解决方案。将新项目命名为MyWebSite.Presentation。删除默认创建的Class1.vb
    3. 通过选择添加 > 新项目并选择 Web 应用程序项目,将新的 Web 应用程序添加到项目中。将项目命名为MyWebSite.Web 并将其设置为启动项目(通过右键单击它)。
    4. 右键单击MyWebSite.Web 项目并将项目引用添加到MyWebSite.Presentation 项目。

    您的分层项目结构现已完成。

    presentation项目添加一个新类并将其命名为Presenter

    Public Class Presenter
        Public Function Display() As String
            Return "hello"
        End Function
    End Class
    

    现在,在 ASPX 页面中的按钮单击事件处理程序中,您可以编写:

    Protected Sub Button1_Click(sender As Object, e As EventArgs)
        Dim presenter As New Presentation.Presenter
    
        Response.Write(presenter.Display)
    End Sub
    

    同样,此示例相当简单,但可以帮助您了解如何将代码分层。我选择将图层分成项目;但是,使用文件夹或命名空间同样有效。

    【讨论】:

    • 有趣的建议。唯一的问题是,为什么他们需要在两个不同的“项目”中使用相同的“解决方案”。我需要更多地玩弄它,但这对我来说很有意义。感谢您的宝贵时间和精彩的解释。
    • @ptownbro 如前所述,他们不需要。您可以将所有代码放在一个项目(例如 Web 应用程序)中,并使用文件夹(或命名空间)对其进行组织。这是一个品味问题,但也取决于项目的规模和复杂性,如果你问我的话。然而,在代码重用和维护方面,将代码分层组织是必须的,除了非常小的项目外,您只能在所有项目中从中受益。
    【解决方案2】:

    是的,有一个很好的方法是通过创建一个作为业务经理或页面“引擎”的类,然后两个页面都可以拥有自己独立的代码隐藏文件,并在两个页面的每个按钮的 buttonClick 事件中页面你除了调用你的类,静态与否,如果类是这样的静态:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
      SiteEngine.DoWork()
    
    End Sub
    

    如果 SiteEngine 类不是静态的,你只需要在调用 DoWork 方法之前创建它的一个实例

    这只是处理您的问题并避免代码重复的多种方法之一,这在大多数情况下是不需要的。

    【讨论】:

    • 嗯。感谢您的回复,但我不确定这是否是我正在寻找的解决方案。我举了一个基本的例子,但这需要处理更复杂的东西,并使用网页/表单对象、方法等......我无法想象你的方法是如何做到的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多