Çoklu Arama-Multi Task Search-.Net Core

 



Multi Task Search:

Selam arkadaşlar,

Bugün anlatacağımız pratik dersimizde,  autocomplete ile birlikte çoklu arama yapacağız.

Sistemlerimiz üzerinde bulunan search kısmı ile birlikte kullanıcının aradığı text leri backend e alıp birçok alanda eşleştirerek kullanıcıya öneriler sunacağız.

Birçok derslerde olduğu gibi kendisinden ilham aldığım sevgili Bora Kaşmer hocamıza burdan teşekkürlerimi iletmeden geçmiyorum.


1) Arama sonucunun ekrana basılacağı div alanını oluştururuz.

<div class="divResult" id="searchDiv"></div>


2) Arama yapacağımız alanın html kodunu yazarız.

 <input class="form-control mdb-autocomplete form-control-sm mr-3 w-75" name="itemcode" type="text" id="automplete" placeholder="Enter an item keyword..."aria-label="Search">


3) Aranan değeri post edeceğimiz script kodlarını yazarız.


 

$('#automplete').keyup(function (event) {
                if (event.keyCode != 13 && event.keyCode != 37 && event.keyCode != 39) {
                    if ($.trim($(automplete).val()).length > 2) {

                        delay(function () {
                            var data = { searchKey: $('#automplete').val() };

                              $.ajax({
                                type: "POST",
                                data: data,
                                url: "/Content/MultiSearch",
                                success: function (data) {

                                    $("#searchDiv").html(data);
                                    $("#searchDiv").show();

                                },
                                error: function (error) {
                                    if (error.status == 500) {



                                   window.location.href="/Home/Index";
                                    } else {
                                        if (error.status != 0) {
                                            alert(err.statusText);
                                        }
                                    }
                                }
                            })

                        }, 500);
                    } else {
                        $("#searchDiv").hide();
                    }
                }
            })



 var delay = (function () {

                var timer = 0;

                return function (callback, ms) {

                    clearTimeout(timer);

                    timer = setTimeout(callback, ms);

                };

            })();
 

4) Controller tarafında post ettiğimiz kod içeriği:

- Oluşturduğumuz task sayısı aynı anda yapcağımız işlem sayısı olarak düşünebilirsiniz.

- Dönüş tipi olarak partialviewresult döneceğiz.Döndüğümüz bu değeri ekrana basacağız.

-Not:Dönüş için _SearchResult adında partialview oluşturmamız gerekiyor.

 public async Task MultiSearch(string searchKey)
        {
            try
            {
                
                var tasks = new Task[3];
                int i = 0;
                SearchModel viewModel = new SearchModel();
                viewModel.SearchKey = searchKey;
                List TaskList = GetSeachResult(searchKey, viewModel);

                foreach (Task tsk in TaskList)
                {
                    tasks[i] = tsk;
                    i++;
                }
                await Task.WhenAll(tasks);
               

                return PartialView("_SearchResult", viewModel);

            }
            catch (Exception ex)
            {
                _logger.LogCrud(_loggedUser.RegisterId, Data.Enum.CrudEnum.Error.ToString(), ex);
              
                throw;
            }
          

        }

 

--Arama Yapılan method:

 private List GetSeachResult(string search, SearchModel model)
        {
           
            List Tasks = new List();

         

            var taskWithKeyword1 = Task.Factory.StartNew(() =>
            {
                model.ItemMasterWithKeyword = _itemservice.getItemListWithKeyword(search);
                if (model.ItemMasterWithKeyword.Count()>0)
                {
                    model.ItemImages = _itemservice.getmatchingitemskeyword(model.ItemMasterWithKeyword);

     Tasks.Add(taskWithKeyword1);
                }
            });



  var taskWithKeyword2 = Task.Factory.StartNew(() =>
            {
                model.ItemMasterWithKeyword = _itemservice.getItemListWithKeyword(search);
                if (model.ItemMasterWithKeyword.Count()>0)
                {
                    model.ItemImages = _itemservice.getmatchingitemskeyword(model.ItemMasterWithKeyword);

 Tasks.Add(taskWithKeyword2);
                }
            });

  var taskWithKeyword3 = Task.Factory.StartNew(() =>
            {
                model.ItemMasterWithKeyword = _itemservice.getItemListWithKeyword(search);
                if (model.ItemMasterWithKeyword.Count()>0)
                {
                    model.ItemImages = _itemservice.getmatchingitemskeyword(model.ItemMasterWithKeyword);

 Tasks.Add(taskWithKeyword3);
                }
            });


       
            _logger.LogCrud(_loggedUser.RegisterId, Data.Enum.CrudEnum.View.ToString(), taskWithKeyword);
            
            return Tasks;
        }

 

5)Methodumuzdan dönen modelimizi oluşturduğumuz partialview e göndeririz.Böylece gönderdiğimiz modeli partialview üzerinden ana ekranda göstermiş oluruz.Örnek olarak partialview kodları.

@model Data.DTO.SearchModel

<div class="card">
    <div class="card-header">

        <div class='MenuItemHeader SearchResultHead'>
            <div class='SearchResultHeadLeft'>Item Keyword Contains</div><div class='SearchResultHeadRight'>
            </div><div class='clear'></div>
        </div>

    </div>

    <div class="card-body">

        <div>
            @if (Model.ItemMasterWithKeyword.Count() > 0)
            {
                <table class="table table-bordered">

                    <thead>

                        <tr>
                            <th class="font-weight-bold">Item Picture</th>
                         
                            <th class="font-weight-bold">Item Code</th>
                            <th class="font-weight-bold">Item Keywords</th>
                            <th class="font-weight-bold">Go Item</th>
                        </tr>

                    </thead>
                    <tbody>
                        @foreach (var item in Model.ItemMasterWithKeyword)
                        {
                        <tr>
                            <td>
                                @if (Model.ItemImages.Count > 0)
                                {
                                    @foreach (var item2 in Model.ItemImages.Where(x => x.ItemCode == item.ItemCode))
                                    {
                                        if (item2.ItemCode != null)
                                        {

                                            <img src="/Images/ProjectImages/@item2.ItemImagePath" width="50" height="50" alt="">
                                        }
                                        else
                                        {
                                            <img src="~/uploads/no-images/no-images.jpg" width="50" height="50" />

                                        }

                                    }
                                }
                                else
                                {

                                    <img src="~/uploads/no-images/no-images.jpg" width="70" height="70" />
                                }





                            </td>
                           
                            <td class='SearchResultItem'>
                                @Html.Raw(item.ItemCode)
                            </td>
                            <td>@item.ItemKeywords</td>
                            <td>
                                <a href="@Url.Action("ItemDetail","Content",new {itemcode=item.ItemCode })" class="btn btn-sm btn-primary">View</a>
                            </td>

                        </tr>

                        }

                    </tbody>



                </table>
            }
            else
            {
                <span class="badge badge-warning">No Result</span>
            }



        </div>

    </div>

</div>



Sonuç olarak arama yaptığımız değer ile eşleşen sonuçlarımızı partialview ile ekrana gönderiyoruz.

Temsili örnek olarak aşağıdaki görüntüyü bırakıyorum. 



Bir sonraki makalede görüşmek dileğiyle.



Popüler Yayınlar