Как передать параметры методу, если пользователь оставляет несколько параметров пустыми и хочет опустить?

#.net #vb.net #if-statement #conditional-statements

#.net #vb.net #if-statement #условные операторы

Вопрос:

У меня есть один веб-сервис, которому мне нужно отправить несколько параметров, но пользователь может оставить несколько пустых и несколько заполненных, но проблема в том, что если мы передаем empty или null, веб-сервис ничего не возвращает, и поставщик не изменяет его.

итак, нам нужно что-то сделать с нашей стороны.

Я сделал так, что взял одну переменную строку, а затем добавил ее к URL.

    If String.IsNullOrEmpty(txtEqptType.Text) Then
                Dim command As String = "Equips?$filter= TypeID eq 'Safety'"
            ElseIf String.IsNullOrEmpty(txtEquipID.Text) Then
                Dim command As String = "Equips?$filter= EquipID eq 'FIRE EXT 150'"
            ElseIf String.IsNullOrEmpty(txtPlant.Text) Then
                Dim command As String = "Equips?$filter= Plant eq 'MfgSys'"
            ElseIf String.IsNullOrEmpty(txtDescription.Text) Then
                Dim command As String = "Equips?$filter= Description eq 'Fire Extinguisher 150_1'"
            End If
  

но чего мне нужно добиться, так это того, что если один параметр пуст, т.Е. Не заполнен, то он не должен передаваться веб-сервису в строке запроса. Есть ли какой-нибудь короткий и надежный способ? bcz Если я это сделаю, мне придется написать много условий if else.

Комментарии:

1. Являются ли фильтры взаимоисключающими? Я имею в виду, что ваш код допускает только одно условие фильтра.

2. Не могли бы вы показать нам пример с двумя фильтрами, пожалуйста?

3. @AndrewMorton уверен: Equips?$filter=Plant eq ‘MfgSys’ и EquipID eq ‘FIRE EXT 150’

4. @Steve нет нескольких, но если один из них пуст, он не должен передаваться.

Ответ №1:

Теперь, когда вы прояснили свою проблему, я думаю, вы могли бы решить проблему таким образом.

Сначала создайте класс, который в общем случае обрабатывает условие пустой строки.
Мы могли бы назвать это ConditionBuilder

 Public Class ConditionBuilder
    
    ' We store the valid condition here
    Dim conditions As List(Of String) = New List(Of String)


    ' We add the condition to the list only if the checkstring is not empty
    Public Sub AddCondition(checkString As String, condition As String)
        If Not String.IsNullOrEmpty(checkString) Then
            conditions.Add(condition)
        End If
    End Sub

    ' We build the result query string from the conditions that we have stored
    Public Function GetCondition() As String
        If conditions.Count = 0 Then
            Return ""
        End If
        
        Return "Equips?$filter = " amp; String.Join(" and ", conditions)
    End Function
        
End Class 
  

Теперь нам не нужно загромождать наш код множеством проверок, но таким образом мы вызываем conditionbuilder напрямую

 Sub Main
    Dim cb As ConditionBuilder = New ConditionBuilder()
    cb.AddCondition(txtEqptType.Text, "TypeID eq 'Safety'")
    cb.AddCondition(txtEquipID.Text,"EquipID eq 'FIRE EXT 150'")
    cb.AddCondition(txtPlant.Text,"$Plant eq 'MfgSys'")
    cb.AddCondition(txtDescription.Text, "$Description eq 'Fire Extinguisher 150_1'")
    Dim condition = cb.GetCondition()
    Console.WriteLine(condition)
End Sub
  

Обратите внимание, как я перевернул логику в строке.IsNullOrEmpty . Если я правильно понял, вы хотите передать параметр, только если связанное текстовое поле не является пустым. Учтите также, что, возможно, вам следует изменить строку.IsNullOrEmpty со строкой.IsNullOrWitheSpace .

На самом деле этот код записывает фиксированный текст для каждого из ваших текстовых полей. Но если вам нужно заменить текст между одинарными кавычками фактическим содержимым текстового поля, вы можете изменить эту строку

     conditions.Add(condition)
  

с

     condition.Add(string.Format(condition, checkString))
  

Конечно, это означает, что вам также нужно изменить точку, в которой вы вызываете AddCondition, чтобы вставить формат, требуемый String .Формат для выполнения подстановки строки.

Итак, у вас должно быть

  cb.AddCondition(txtEqptType.Text, "TypeID eq '{0}'")
  

и так далее для других вызовов AddCondition

Комментарии:

1. позвольте мне попробовать, это кажется многообещающим

Ответ №2:

Поместите все свои значения в a List(Of String) , объедините их с помощью соответствующего оператора String.Join , а затем объедините все, что вам нужно, например

 Dim days As New List(Of String)

days.Add("Monday")
days.Add("Wednesday")
days.Add("Friday")

Console.WriteLine("I work on {0}.", String.Join(" and ", days))
  

Это приведет к:

Я работаю в понедельник, среду и пятницу.

Вы могли бы добавить туда и комбинацию дней, и все будет работать так, как ожидалось. Вы можете использовать тот же принцип для объединения любого списка подстрок с общей разделяющей подстрокой.

Комментарии:

1. Мне кажется, что проблема заключается в множестве условий if — else if — else if — else

2. @Steve, тогда ты ошибаешься. Вам все равно нужно протестировать каждый TextBox из них по отдельности, чтобы увидеть, был ли он заполнен или нет, и создать соответствующий критерий со значением, если он есть. Волшебного способа обойти это нет. На самом деле, все они должны быть отдельными If операторами. Проблема в том, как объединить эти критерии в один оператор command независимо от комбинации, и я продемонстрировал это.