ASP.NET w/ VB.NET - Winforms to Web - ошибка NullReferenceException при разбиении строки / построителе строки
Предыстория: у меня есть приложение winForm, которое регистрирует пользователя в базе данных на основе предоставленной информации, автоматически генерирует случайный пароль и имя пользователя и отправляет пользователю по электронной почте ссылку на приложение для выбранной маркетинговой компании.
Проблема:
- Когда пользователь нажимает "Отправить приглашение" с данными, введенными во все поля, кроме списка пакетов в отладке, выдается ошибка NullReferenceException, выделяющая строку: Dim MCShort As String = Trim(splitMC(0))
Как я могу исправить эту проблему
Вот скриншот веб-приложения:
Вот код метода Send_Button_Click от default.asx.vb:
Private Sub Send_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Send_Button.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(marketingCo.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 bundles.Items
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("aComp Invitation Sent! :)")
End Sub
2 ответа
Для первого вопроса вы можете использовать событие OnSelectedIndexChanged для lbCarriers.
Что касается вопроса об отсутствующих данных при отправке, вы должны использовать своего рода проверку на представленной странице. ASP.Net включает в себя набор элементов управления проверкой, которые облегчают работу. На простейшем уровне вы можете установить необходимые элементы управления формой, и это позволит форме запрашивать у пользователя заполнение всех обязательных полей до того, как сработают события выделенного кода.
Я переписал следующие области кода, чтобы избавиться от ошибки:
''Get Marketing Company Short Name
Dim splitMC As String() = marketingCo.SelectedItem.ToString().Split("|")
Dim MCShort As String = Trim(splitMC(0))
Protected Sub lbCarriers_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles lbCarriers.SelectedIndexChanged
Dim splt() As String
Dim ac1 As Array
bundles.Items.Clear()
Dim item As ListItem = lbCarriers.SelectedItem
splt = item.ToString().Split("|")
ac1 = proxy.GetContractingBundles("test", "test", Trim(splt(0)))
For Each Pitem In ac1
bundles.Items.Add(Trim(splt(2)) & " | " & Pitem.FormBundleName)
Next
End Sub