Member 12915152 Ответов: 1

Не получая никаких данных в то время как все параметры передаваемые через вызов ajax jquery равны нулю


Я создаю страницу SearchVendor с 3 выпадающими фильтрами (city/area/vendortype).При прокрутке страницы он должен отображать связанных поставщиков, отфильтрованных пользователем.
Чтобы получить вышеописанный результат я создал
1)Хранимая процедура(значение pagenumber/размер страницы/города/района/vendortype)- Который должен возвращать все данные на основе комбинации фильтров, выбранных пользователем. Если ни один из фильтров не выбран, то он должен возвращать все данные, то есть поставщика.
2)Веб-сервиса(значение pagenumber/размер страницы/города/района/vendortype) - получить данные из базы данных
3)Ajax Jquery - Для логики прокрутки страницы и передачи параметров в веб-сервис.

Моя проблема в том, что
Я получаю правильные данные, когда выбраны все 3 варианта (город/район/тип поставщика).Но он не показывает никакого результата, когда один из вариантов(
city/area/vendortype
) не выбирается.

Что я уже пробовал:

<script type="text/javascript">
        $(document).ready(function () {
            var currentPageNumber = 1;
            loadData(currentPageNumber);

            $(window).scroll(function () {
                if ($(window).scrollTop() == $(document).height() - $(window).height()) {

                    currentPageNumber += 1;
                    loadData(currentPageNumber);
                }

            });

            function loadData(currentPage) {
                var parcity=$("#lblCityParameter").val();
                var pararea = $("#lblAreaParameter").val();
                var parvendortype = $("#lblVendortype").val();
                $.ajax({
                    type: 'post',
                    url: 'WebService/VendorService.asmx/GetVendors',
                    data: { pageNumber: currentPage, pageSize: 6, city:parcity, area:pararea, vendortype:parvendortype },
                   dataType: 'json',
                   //contentType: "application/json; charset=utf-8",
                     success: function (data) {
                      var vendorRepeater = $('#repdata');
                      $(data).each(function (index, ven) {
                         
                            vendorRepeater.append('<div class="col-md-4 wow fadeInLeft animated" data-wow-delay="0.4s" style="text-align:center"><div id="Div1" class="living_boxauto" runat="server"><a href="/KB/answers/VendorDetails.aspx"?VendorId=' + ven.pID + '"><div class="media"><img runat="server" class="img-responsive" src="images/'
                                + ven.pcoverimage +
                                '" style="width:300px;height:200px;" /><div class="media__body"><h2>Image Title</h2><p>Description</p></div></div></a><div id="Div2" class="living_desc" runat="server"><h3><a href="/KB/answers/VendorDetails.aspx"?VendorId='
                                + ven.pID +
                                '"><asp:Label ID="lblVendorName" runat="server" Text="'
                                + ven.pvendorname +
                                '" CssClass="lblVendorName"></asp:Label></a></h3><p></p></div></div></div>');
                        });
                    }
                });

            }

        });

    </script>


[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService]
public class VendorService : System.Web.Services.WebService {

    public VendorService () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }


    //   public void GetVendors(int pageNumber, int pageSize)
    [WebMethod]
 //  [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
  public void GetVendors(int pageNumber, int pageSize, string city, string area, string vendortype)
  {
        List<VendorData> listVendors = new List<VendorData>();

        string cs = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(cs))
        {
            SqlCommand cmd = new SqlCommand("spGetVendorbyFilter", con);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@PageNumber", pageNumber);
            cmd.Parameters.AddWithValue("@PageSize", pageSize);
            
            cmd.Parameters.AddWithValue("@city", city);
            cmd.Parameters.AddWithValue("@area", area);
            cmd.Parameters.AddWithValue("@vendortype", vendortype);
            

            con.Open();
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                VendorData vendor = new VendorData();
                vendor.pID = Convert.ToInt32(rdr["VendorID"]);
                vendor.pvendorname = Convert.ToString(rdr["VendorName"]);
                vendor.pcoverimage = Convert.ToString(rdr["CoverImage"]);
                vendor.pcategory = Convert.ToString(rdr["Category"]);
                listVendors.Add(vendor);

            }
        }

        JavaScriptSerializer js = new JavaScriptSerializer();
        Context.Response.Write(js.Serialize(listVendors));
    }
    
}



ALTER PROCEDURE [dbo].spGetVendorbyFilter 
                      @PageNumber INT,
                      @PageSize   INT,
                      @city       VARCHAR(200),
                      @area       VARCHAR(200),
                      @vendortype VARCHAR(200)
AS
  BEGIN
      DECLARE @StartRow INT
      DECLARE @EndRow INT

      SET @StartRow = ( ( @PageNumber - 1 ) * @PageSize ) + 1;
      SET @EndRow= @PageNumber * @PageSize;



WITH Result
           AS (
               SELECT *,
                      Row_number()
                        OVER (
                          ORDER BY VendorID ASC) RowNumber
               FROM   tblVendor WHERE (@city IS NULL OR (City = @city))
                 AND  (@area IS NULL OR (Area = @area))
                 and  (@vendortype IS NULL OR (Category = @vendortype))
               
              ) 
                  
     Select  * from Result
     WHERE RowNumber BETWEEN @StartRow And @EndRow

END

F-ES Sitecore

Вам не нужно использовать JSON.stringify для переменной данных, это уже строка. Google для того, как вы отправляете данные в веб-сервис через jquery, это очень хорошо документированная проблема.

Member 12915152

@fes-sitecore-Спасибо за ответ. Я обновил свой запрос. Не могли бы вы, пожалуйста, разобраться в этом.

F-ES Sitecore

Предложение "(@area IS NULL OR (Area = @area)) " является правильным, но вы никогда не передаете NULL в @area, если параметр не был указан, вы передаете пустую строку, и SQL не считает это NULL. Дайте парам значения по умолчанию, а затем просто опустите значения для данных, которых у вас нет

СП;
@city VARCHAR(200) = null,
@area VARCHAR(200) = null,
@vendortype VARCHAR(200) = null

затем измените код на что-то вроде

if (! string.IsNullOrWhiteSpace (город))
{
УМК.Параметры.AddWithValue ("@city", город);
}

Tomas Takac

Вам нужно использовать кнопку "ответить", иначе пользователь не будет уведомлен о вашем комментарии.

Member 12915152

Спасибо, Томас Такак.

1 Ответов

Рейтинг:
12

Peter Leow

Вы явно не передали NULL для невыборки.
Проверить это: Передача нулевых параметров / содержимого T-SQL из SQL Server Pro[^]


Member 12915152

Спасибо Питеру Леоу. Ваш ответ просто потрясающий. Это действительно работает на меня.

Я добавил приведенный ниже код в свой веб-метод.


если (город !="")
{
УМК.Параметры.AddWithValue ("@city", город);

}
ещё
{
УМК.Параметры.AddWithValue ("@city", DBNull.Ценность);
}

если (площадь !="")
{
УМК.Параметры.AddWithValue ("@area", area);

}
ещё
{
УМК.Параметры.AddWithValue ("@area", DBNull.Ценность);
}
если (vendortype !="")
{
УМК.Параметры.AddWithValue ("@vendortype", vendortype);

}
ещё
{
УМК.Параметры.AddWithValue ("@vendortype", DBNull.Ценность);
}

и незначительное изменение хранимой процедуры.

@city VARCHAR(200)= NULL,
@area VARCHAR(200)= NULL,
@vendortype VARCHAR(200)= NULL