尝试显示自动完成结果 - ASP.NET Core MVC

问题描述 投票:0回答:1

我有一个我调用的 API,它调用将数据返回到 Ajax 调用的方法。都好。我在文本框中看到的只是一堆对象。这是我的全部代码。我知道我已经很接近了。

ASP.NET Core MVC - 这正在处理

GET
数据。

部分观点:

<tr>
    <td class="pe-1 col-md-1">
         <input type="text" id="search" placeholder="id or name" class="form-control w-search ui-autocomplete" autocomplete="on" />                                        
    </td>
    <td class="col-md-6">
        <input type="button" value="Search" id="searchButton" class="btn btn-primary2 w-auto ms-0" />
    </td>                                   
</tr>

AJAX 调用:

$(document).ready(function () {
    $("#search").autocomplete({
        source: function (request, response) {
            $.ajax({
                url: '/api/AutoComplete/search',
                headers: {
                    "RequestVerificationToken":
                        $('input[name="__RequestVerificationToken"]').val()
                },
                // data: { "term": request.term },
                data: JSON.stringify(request.term),
                datatype: 'json',
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    // response($.map(data, function (item) {
                    //     return {
                    //         label: item.name,
                    //         value: item.id
                    //     };
                    // }));
                     $('#search').val(data);  //NEED TO DISPLAY IT HERE
                    debugger;
                },
                error: function (xhr, textStatus, error) {
                    alert(xhr.statusText);
                },
                failure: function (response) {
                    alert("failure " + response.responseText);
                }
            });
        },
        select: function (e, i) {
            alert(e);
            alert(i);
        },
        minLength: 1,
        DelayNode: 800
    });
});`

API:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MIParticipation.Models;
using MIParticipation.Models.ViewModel;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace MIParticipation
{
    [Route("api/AutoComplete")]
    [ApiController]
    public class AutoCompleteAPIController : ControllerBase
    {
        private MiparticipationContext db = new MiparticipationContext();

        [Produces("application/json")]
        [HttpGet("search")]
        [Route("home/search")]
        public async Task<IActionResult> Search()
        {
            try
            {
                string term = HttpContext.Request.Query["term"].ToString();

                Task<List<SearchListResults>> results = null;
                int intResult;
                bool isNAIC = int.TryParse(term, out intResult);
                
                if (isNAIC == true)
                {
                    results = db.SearchAutoComplete(term);                    
                }
                else
                {
                    results = db.SearchAutoComplete(term);
                }
                    
                return Ok(await results);
            }
            catch (Exception ex)
            {
                return BadRequest();
            }
        }
    }
}

数据库方法:

public async Task<List<SearchListResults>> SearchAutoComplete(string _searchString)
{
    var searchString = new SqlParameter("@SearchValue", _searchString);

    List<SearchListResults> results = new List<SearchListResults>();
    SearchListResults result = null;
           
    try
    {            
        var builder = WebApplication.CreateBuilder();
        var connectionString = builder.Configuration.GetConnectionString("MiParticipationConnection");

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            SqlCommand cmd = new SqlCommand()
            {
                CommandText = "spGetFilteredCompanyList",
                CommandType = System.Data.CommandType.StoredProcedure
            };

            SqlParameter param1 = new SqlParameter
            {
                ParameterName = "@SearchValue", 
                SqlDbType = SqlDbType.VarChar, 
                Value = _searchString, 
                Direction = ParameterDirection.Input 
            };

            cmd.Parameters.Add(param1);
            cmd.Connection = conn;

            conn.Open();

            SqlDataReader rdr = cmd.ExecuteReader();
            
            if (rdr.HasRows)
            {
                while (rdr.Read())
                {
                    SearchListResults list = new SearchListResults()
                    {
                        id= rdr["id"].ToString(),
                        name = rdr["name"].ToString()
                    };
                    results.Add(list);                        
                }                  
            }                                        
        }
    }
    catch (System.Exception ex)
    {
        NLog.Logger _logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
        _logger.Error("Exception " + "InnerException " + ex.InnerException + "Message " + ex.Message + "StackTrace:" + ex.StackTrace + " Method that failed: " + MethodBase.GetCurrentMethod());
    }
    
    return await Task.FromResult(results);        
}

模型类:

using System.ComponentModel.DataAnnotations.Schema;

namespace MIParticipation.Models.ViewModel
{
    public class SearchListResults
    {
        public string naic { get; set; }
        public string name { get; set; }
    }
}

我检查了 db 方法的结果,数据看起来不错(id,name)列表。我可以显示两个连接,但我实际上只需要他们做出选择后的 id。对不起我的新手。我希望我发的帖子够多了。我希望列表显示在文本框或其他内容中。

提前致谢, 中号

ajax autocomplete asp.net-core-mvc
1个回答
0
投票

需要几个步骤。

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<h2>@ViewData["Title"]</h2>

<div class="row">
    <div class="col-md-6">
        <label for="search">Search:</label>
        <input type="text" id="search" name="search" class="form-control">
    </div>
</div>

<script>
    $(document).ready(function () {
        $("#search").autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: '/api/AutoComplete/Search',
                    data: { term: request.term },
                    dataType: 'json',
                    success: function (data) {
                        response($.map(data, function (item) {
                            return {
                                label: item.name,
                                value: item.id    
                            };
                        }));
                    },
                    error: function (xhr, textStatus, errorThrown) {
                        console.error('Error in fetching autocomplete data: ', textStatus);
                    }
                });
            },
        });
    });
</script>

© www.soinside.com 2019 - 2024. All rights reserved.