【问题标题】:Passing webforms inputs to class that isn't codebehind asp.net vb将 webforms 输入传递给不是代码隐藏 asp.net vb 的类
【发布时间】:2025-12-08 09:30:01
【问题描述】:

我在 web 表单上有一些数据,我不想写入代码隐藏中的变量,我希望它在 App_Code 中的单独类中提取字段。我试过Request.form 并在网络表单上使用帖子,但它找不到Request.form 的方法,可能是因为它没有链接。目前,下面的代码正在从代码隐藏中提取数据,但我无法在单独的类中运行函数,因为我无法在不将变量传递给函数的情况下从代码隐藏中调用数据。这甚至可能您可以将表单创建为对象吗?

Public Sub DeclareInputFields()
    input1.CalcReference = inCalcRef.text
    input1.DOL = If(String.IsNullOrEmpty(indol.text), Nothing,    DateTime.Parse(indol.text))
    input1.APP = If(String.IsNullOrEmpty(inAPP.text), Nothing, Decimal.Parse(inAPP.text))
    input1.CPD = If(String.IsNullOrEmpty(inCPD.text), Nothing, Decimal.Parse(inCPD.text))
End Sub

【问题讨论】:

  • 我已将您的问题读了四遍,但我仍然不确定您要问什么。你到底想做什么?
  • @DavidW 我只是想在代码隐藏之外的另一个类中访问在网络表单中输入的文本。
  • 您不能只将相关字段(或请求对象本身)作为参数传递给感兴趣的 App_Code 类中的函数吗?
  • 我可以,但我在表单上有很多输入框,感觉不是最有效的发送方式。我更喜欢以某种方式访问​​对象中的文本框。
  • 然后只需在您的 App_Code 文件中定义相关类的方法,即可接受 Request 对象作为单个参数。然后,您可以直接从该方法访问 Request.Form 集合。

标签: c# asp.net vb.net webforms


【解决方案1】:

在 App_Code 的文件中定义的类仍然需要从某个地方调用。您可以在后面的代码中实例化该类,也可以在 ASP.NET 中使用其他类型的文件之一。

请求必须到达某个地方。其他一些可供选择的选项

如果您的调用类似于来自 JavaScript 的 AJAX 调用,则为 ashx 文件。

一个处理程序,如果你想对表单做一些除了处理请求之外的事情。查看 IHttpModule(您还需要在 web.config 中注册以进行额外处理)。

【讨论】:

    【解决方案2】:

    下面是 App_Code 中的 VB 类如何定义函数以获取 Form 集合、Request 对象或 Controls 集合的“外壳”:

    Imports Microsoft.VisualBasic
    Imports System.Collections.Specialized
    Imports System.Collections.Generic
    Imports System.Web
    Imports System.Web.UI
    Public Class VBDemoClass
    
       Sub DemoMethod(MyCollection As NameValueCollection)
          ' Do stuff here
       End Sub
    
       Sub DemoMethod(MyRequest As HttpRequest)
          ' Do stuff here
       End Sub
    
       Sub DemoMethod(MyControls As ControlCollection)
          ' Do stuff here
       End Sub
    End Class
    

    在您的代码隐藏中,只需实例化 VBDemoClass,然后根据需要调用其中一个函数...如果您将方法设为静态,您也可以跳过实例化,但这是一个实现细节,我将留给您的目的。

    在您的网页代码隐藏中,实例化您的类并在代码隐藏触发时使用您已经可用的对象之一调用您的方法:

    Public Class Page1
    
        Sub Page_load(ByVal Object as Sender, ByVal e as EventArgs)
           Dim foo as New VBDemoClass
           Foo.DemoMethod(Request.Form)
           ' or
           Foo.DemoMethod(Request)
           ' or
           Foo.DemoMethod(Page.ControlsCollection)
        End Sub
    End Class
    

    【讨论】:

    • 是的,我认为我们肯定在同一页面上,我可以实例化整个表单还是需要将每个输入框发送到上述请求?
    • 您不需要实例化表单或发送每个项目。从您的代码隐藏页面中,您可以调用该方法并将 Request.Form、Request 或 Page.ControlsCollection(分别)传递给这些方法。当代码隐藏触发时,您已经拥有这些对象。
    • 那么我是否要在代码隐藏中创建一个 vbdemo 类的实例作为对象并调用 demo 方法并将表单名称作为 http 请求传递?或者我可以直接从 vbdemo 类调用表单请求。如果我不太明白,请道歉。非常感谢。
    • 没问题!从您的代码隐藏中,只需实例化该类,然后使用“Request”对象、Request 对象的 Form 属性或 Page.ControlsCollection 调用该方法。当代码隐藏触发时,您已经掌握了这些;例如,您可以直接从 Page_Load 事件中访问它们。我将修改我的答案以显示一个示例。
    • 现在完美了,再次感谢真的很有帮助