【问题标题】:VB.NET - Easiest way to Export / Convert WinForm App to Web ASP.NET AppVB.NET - 将 WinForm 应用程序导出/转换为 Web ASP.NET 应用程序的最简单方法
【发布时间】:2011-08-01 14:49:49
【问题描述】:

背景:我有一个用 VB.NET 编写的 winform 应用程序,它使用 WebService 根据他们选择的营销公司向用户发送不同的邀请以进行不同的采访。 winform 应用程序从各种文本框、列表框和下拉列表中提取字符串值,以创建一些 XML 并将其推送到名为 AcompServiceClient 的 Web 服务

问题:

  • 是否有向导或第 3 方应用程序可以将 winform 数据导出到 webform asp.net,或者我是否应该从头开始构建一个 aspx 页面,其中所有控件的命名空间与 winform 应用程序相同?
  • 除了 AcompServiceClient Web 服务和代码隐藏 vb 之外,我还需要传输或设置哪些文件才能完成这项工作? (查看项目文件的屏幕截图)
  • 我是否必须复制 app.config 文件的任何部分并使其适应 web.config 文件?

我在想:

  • 我可以先将 Acomp_Invitation_Form.vb 复制到页面后面的 AComp_Invitation_Web_App.aspx.vb 代码。
  • 从网络服务器中添加现有的网络服务
  • 在前端aspx页面使用相同的名称/id手动重新添加格式、文本框、列表框和下拉列表

这是 WinForm App 的截图:

这是项目文件的屏幕截图:

这是我在 Acomp_Invitation_Form.vb 上的代码:

Imports TestClient.aCompService
Imports System.Text
Public Class Form1

Private proxy As New AcompServiceClient
Private Sub stuff()

    Dim splitContractingBundle() As String
    splitContractingBundle = Split(cb2.SelectedItem, "|")
    Dim splitMarketingCompany() As String
    splitMarketingCompany = Split(cb3.SelectedItem, "|")
    Dim strDate As String = System.DateTime.Now.ToString
    Dim strOpData As String = String.Format("{0}~{1}~{2}~{3}~{4}~{5}~{6}~{7}~{8}~{9}~{10}",
                                            Trim(splitMarketingCompany(0)), txtFirstName.Text, "", txtLastName.Text,
                                            txtEmail.Text, txtEmail.Text, "1", strDate,
                                            "Pending", "1/1/1900", Trim(splitContractingBundle(0)))

    Dim int1 As Boolean = proxy.AddContractOpportunity(strOpData, "test", "test")
    txtEmail.Text = ""
    txtFirstName.Text = ""
    txtLastName.Text = ""
    lbCarriers.Items.Clear()
    cb2.Items.Clear()
    cb3.Items.Clear()
    cb2.SelectedItem = ""
    cb3.SelectedText = ""
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    'TODO Add code to validate that all selections that are reaquired are met.
    'ccemail and the additional message are not required
    Dim firstname As String = txtFirstName.Text
    Dim lastname As String = txtLastName.Text
    Dim ccEmail As String = txtccEmail.Text
    Dim sb As New StringBuilder
    sb.AppendLine("<?xml version=""1.0"" encoding=""utf-8""?>")
    sb.AppendLine("<root>")
    sb.AppendLine("<MarketingCompany>")
    sb.AppendLine("<MarketingCompanyName>")
    ''Get Marketing Company Short Name
    Dim splitMC As String() = Split(cb3.SelectedItem, "|")
    Dim MCShort As String = Trim(splitMC(0))
    sb.AppendLine(String.Format("<MCNAme>{0}</MCNAme>", MCShort))
    'sb.AppendLine(String.Format("<MCNAme>{0}</MCNAme>", My.Settings.MarketingCompanyShortName))
    sb.AppendLine(String.Format("<ccEmail>{0}</ccEmail>", txtccEmail.Text))
    sb.AppendLine(String.Format("<emailMessage>{0}</emailMessage>", txtMessage.Text))
    sb.AppendLine(String.Format("<MarketerName>{0}</MarketerName>", txtMarketerName.Text))
    sb.AppendLine("<agent>")
    sb.AppendLine(String.Format("<FirstName>{0}</FirstName>", txtFirstName.Text))
    sb.AppendLine(String.Format("<LastName>{0}</LastName>", txtLastName.Text))
    sb.AppendLine(String.Format("<Email>{0}</Email>", txtEmail.Text))
    sb.AppendLine("<CRMGuid>123456</CRMGuid>")
    Dim spltBundles() As String

    For Each item In cb2.SelectedItems
        If Trim(item) <> "" Then
            spltBundles = Split(item, "|")
            sb.AppendLine("<ContractingOpportunity>")
            sb.AppendLine(String.Format("<Carrier>{0}</Carrier>", Trim(spltBundles(0))))
            sb.AppendLine(String.Format("<ContractingOpportunityName>{0}</ContractingOpportunityName>", Trim(spltBundles(1))))
            sb.AppendLine("</ContractingOpportunity>")
        End If
    Next
    sb.AppendLine("</agent>")
    sb.AppendLine("</MarketingCompanyName>")
    sb.AppendLine(" </MarketingCompany>")
    sb.AppendLine(" </root>")
    Dim xmlStr = sb.ToString
    Dim int1 As Boolean = proxy.AddContractOpportunity(xmlStr.ToString, "test", "test")
    MsgBox("Made It")
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    GetCarriers()
    GetMarketingCompanies()
End Sub

Private Sub GetCarriers()
    Try
        Dim ac1 As Array
        ac1 = proxy.GetCarrierNames("test", "test")

        For Each item In ac1
            lbCarriers.Items.Add(String.Format("{0} | {1} | {2}", item.CarrierID, item.CarrierNameLong, item.CarrierNameShort))

        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

End Sub
Private Sub GetMarketingCompanies()
    Try
        Dim ac1 As Array
        ac1 = proxy.GetMarketingCompanyNames("test", "test")

        For Each item In ac1
            cb3.Items.Add(String.Format("{0}   |   {1}", item.MarketingCompanyShort, item.MarketingCompanyName))
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Private Sub lbCarriers_LostFocus(sender As Object, e As System.EventArgs) Handles lbCarriers.LostFocus
    Dim splt() As String
    Dim ac1 As Array
    cb2.Items.Clear()

    For Each item In lbCarriers.SelectedItems
        splt = Split(item, "|")
        ac1 = proxy.GetContractingBundles("test", "test", Trim(splt(0)))
        For Each Pitem In ac1
            cb2.Items.Add(Trim(splt(2)) & " | " & Pitem.FormBundleName)
        Next
    Next
End Sub
End Class

【问题讨论】:

  • 嗯,我猜容易是一个相对术语。您可以使用项目详细信息中的设置将表单导出为 activeX 控件,并且 IE(具有适当的程序集信任)将立即加载它。这很容易。
  • @asawyer,感谢您的回复。我在哪里可以找到导出为 activeX 控件的选项?我看到的只是 VS2010 上的导出模板向导
  • 您必须选中“使 COM 可见”复选框,并且可能还有一两个小步骤,然后在 html 中使用对象标记引用它。老实说,这并不是真正可取的,我并不是说它是一个真正的解决方案。不过有点整洁。
  • @asawyer,下面的“使 COM 可见”复选框是什么?
  • 我已经很多年没有做过这个技术了,当时它只是一个简单的演示。除了勾选 com 框外,还涉及更多内容,它仅在 IE 中有效,您必须在您的受信任区域中打开大的安全漏洞,如果您想分发给客户端,您将强制他们安装您的 activex 组件。如果您搜索一下,您需要知道的所有内容都在线。我不会为你做的。

标签: asp.net vb.net winforms-to-web


【解决方案1】:

要非常小心简单的方法。虽然 ASP.NET Web 窗体可能看起来类似于 Windows 窗体(连接到事件的控件),但其底层机制却大不相同。如果您还没有这样做,我建议您阅读 HTTP 的工作原理以及 ASP.NET 页面的生命周期。

【讨论】:

  • 这也有很大的优点......虽然在所问问题的范围内确实很容易从 win 表单移植到 web 表单,如果这只是一个更大的解决方案的一部分,你就是几乎可以肯定的是在进行架构大修。当您迁移到 Web 表单时,存在与状态管理、缓存策略、身份管理等相关的各种问题,需要采用非常不同的方法。
  • +1 只有对 (1) ASP.Net (2) WinForms (3) 原始 WinForms 应用程序本身有很好的了解,简单的方法才会变得简单。当然,对所有这些内容的深入了解对于您在该应用程序上进行的任何未来开发都非常有用,因此值得学习。
  • -1 噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢!大声笑,阅读 HTML 和 ASP.NET 书籍......我们都知道编码是通过实践经验获得的......请给我一些具体的工作,比如关于导出/转换的教程链接。我改写了我的答案,并包括了文件和更具体的问题。改写你的答案,我会撤消-1哈哈
  • 他的意思是,如果您不了解服务器/客户端交互在 asp.net 应用程序中的工作原理以及页面生命周期,您可能会遇到一个难以理解的伤害世界,并且是只是建议您在前进时要小心。
  • @Brian - 虽然我很欣赏这部喜剧,但你完全错过了我的意思。我不是说阅读 ASP.NET 和 HTML(这是给定的!),我说的是了解 WebForms 如何在幕后工作(HTTP 和 ASP.NET 生命周期是其中最主要的)。 没有“逐步”指南将 WinForms 转换为 WebForms。这两种技术彼此差异太大,无法直接转换。 Pete M 刚刚提到了它们根本不同的一些方式。您可能会在不了解小型应用程序的内部运作的情况下逃脱,但对于更大的应用程序则不会
【解决方案2】:

是的,这是一般的想法。我会特别注意与在无状态 Web 环境中使用 AcompServiceClient 相关的任何问题。在不知道它是什么、如何工作或如何使用它的情况下,很难说你是否必须重新考虑如何使用它。

看起来您所做的任何其他事情都依赖于在有状态的环境中运行。您只是从各种文本框中提取字符串值来创建一些 XML 并将其推送到服务。所有这些都应该顺利完成。您可能想考虑添加一些客户端验证规则,但除此之外它看起来很简单。

您需要更改填充 DropDownList 的方式。 win 和 web 表单之间的工作方式略有不同。它想绑定到 webforms 中的数据源。

【讨论】:

  • @Pete,感谢您的回复。您还需要什么其他信息?我应该添加 app.config 还是 webservicedata.xml 文件代码,让您更好地了解我正在使用的内容?
  • 归结为“它是什么?”。它是网络服务吗?通讯接口?其他?从 winforms 到 webforms 就是从有状态到无状态。根据该代理是什么以及它的使用方式,这可能是一个问题。假设它具有某种初始化逻辑,该逻辑应该比单个回发更长的持续时间。在有状态的 winforms 环境中,您无需考虑额外的持久性工作。
  • 另一个问题是您现在物理上在服务器上执行,而不是在单个客户端上执行。也许这个代理对它的运行位置做了一些假设。这可能是一个陷阱。
  • 我看到你添加了一些信息,指出它是一个网络服务。如果您正在使用的代理只是从工作室生成的服务代理,那么您可能很高兴。 “可能”是关键字...
  • @Pete,它不允许我将 webform asp.net 页面添加到这个项目中,所以看起来我必须创建一个全新的项目。是否没有向导或应用程序可以执行此操作?
【解决方案3】:

是的,你想要的方式就是我多次这样做的方式。

只需从您的代码中复制方法并将它们粘贴到您的 asp.net 页面后面的代码中。您的某些方法不兼容,因为它们在 asp.net 中不受支持,但您会发现我们在构建项目时真的很快。

使用与 winform 中的控件名称完全相同的控件创建您的网页。构建时,您所要做的就是修复错误,然后就可以开始了。

看起来您已连接到某些服务,因此您当然需要参考它。

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2011-07-12
    • 2011-04-04
    相关资源
    最近更新 更多