VB.NET - 将WinForm应用程序导出/转换为Web ASP.NET应用程序的最简单方法

时间:2011-04-08 15:21:27

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

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

问题:

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

我在想:

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

以下是WinForm应用程序的屏幕截图:

ACOMP Screenshot

以下是项目文件的屏幕截图:

enter image description here

这是我在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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

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

看起来你很喜欢某种服务,所以当然你需要参考它。

答案 2 :(得分:1)

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

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

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