Hi makumbi,
You can wrap multiple parameters in a single class and use that class as a parameter to your Web API controller method.
Refer below code.
Database
For this example I have used of Northwind database that you can download using the link given below.
Download Northwind Database
Namespaces
Imports System.Collections.Generic
Imports System.Configuration
Imports System.Data.SqlClient
Imports System.Web.Http
Model
Public Class CustomerModel
Public Property Name As String
Public Property City As String
End Class
ApiController
Public Class CustomerAPIController
Inherits ApiController
<Route("api/CustomerAPI/GetCustomers")>
<HttpPost>
Public Function GetCustomers(ByVal customer As CustomerModel) As List(Of Customer)
Dim customers As List(Of Customer) = New List(Of Customer)()
Dim constr As String = ConfigurationManager.ConnectionStrings("conString").ConnectionString
Using con As SqlConnection = New SqlConnection(constr)
Dim query As String = "SELECT CustomerID,ContactName,City FROM Customers WHERE (ContactName LIKE @Name + '%' OR @Name IS NULL) AND (City = @City OR @City IS NULL)"
Using cmd As SqlCommand = New SqlCommand(query)
cmd.Connection = con
cmd.Parameters.AddWithValue("@Name", If(Not String.IsNullOrEmpty(customer.Name), customer.Name, CObj(DBNull.Value)))
cmd.Parameters.AddWithValue("@City", If(Not String.IsNullOrEmpty(customer.City), customer.City, CObj(DBNull.Value)))
con.Open()
Using sdr As SqlDataReader = cmd.ExecuteReader()
While sdr.Read()
customers.Add(New Customer With {
.CustomerID = sdr("CustomerID").ToString(),
.ContactName = sdr("ContactName").ToString(),
.City = sdr("City").ToString()
})
End While
End Using
con.Close()
End Using
End Using
Return customers
End Function
Public Class Customer
Public Property CustomerID As String
Public Property ContactName As String
Public Property City As String
End Class
End Class
HTML
Name:<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
<br />
City:<asp:TextBox ID="txtCity" runat="server"></asp:TextBox>
<asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="Search" />
<hr />
<asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField ItemStyle-Width="150px" DataField="CustomerID" HeaderText="CustomerID" />
<asp:BoundField ItemStyle-Width="150px" DataField="ContactName" HeaderText="Contact Name" />
<asp:BoundField ItemStyle-Width="150px" DataField="City" HeaderText="City" />
</Columns>
</asp:GridView>
Namespaces
Imports System.Net
Imports System.Text
Imports System.Web.Script.Serialization
Code
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
Me.PopulateGridView()
End If
End Sub
Protected Sub Search(ByVal sender As Object, ByVal e As EventArgs)
Me.PopulateGridView()
End Sub
Private Sub PopulateGridView()
Dim apiUrl As String = "http://localhost:26404/api/CustomerAPI"
Dim input As Object = New With {Key
.Name = txtName.Text.Trim(), Key
.City = txtCity.Text.Trim()
}
Dim inputJson As String = (New JavaScriptSerializer()).Serialize(input)
Dim client As WebClient = New WebClient()
client.Headers("Content-type") = "application/json"
client.Encoding = Encoding.UTF8
Dim json As String = client.UploadString(apiUrl & "/GetCustomers", inputJson)
gvCustomers.DataSource = (New JavaScriptSerializer()).Deserialize(Of List(Of Customer))(json)
gvCustomers.DataBind()
End Sub
Public Class Customer
Public Property CustomerID As String
Public Property ContactName As String
Public Property City As String
End Class
Screenshot