3 votes

ASP.NET Core - Les résultats de la barre de recherche reviennent nuls en affichage

J'ai un champ de recherche de base dans lequel je veux afficher des données lorsque l'utilisateur appuie sur la touche "submit" ou "enter". La division s'affiche lorsqu'on clique dessus, mais les données reviennent nulles, même si je peux parcourir mon code d'accès aux données et voir que les données sont ajoutées à une liste. Quelqu'un peut-il m'aider à résoudre ce problème ?

J'ai essayé plusieurs choses pour que cela fonctionne. Je pense que mon problème se situe au niveau du Homecontroller et de la façon dont la vue est affichée.

SearchViewModel.cs

public class SearchViewModel
{
    [DisplayName("Search Query *")]
    [Required]
    public string Query { get; set; }

    public string Subject { get; set; }

    public string Body { get; set; }
}

DataAccess.cs

public static bool GetSearchData(string searchString, out List<SearchViewModel> lstModel)
{
    lstModel = new List<SearchViewModel>();

    try
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();

        SqlCommand command = connection.CreateCommand();

        command.CommandType = System.Data.CommandType.Text;

        command.CommandText = "select Subject, Body from TABLE where Subject = @subject ";
        command.Parameters.AddWithValue("@subject", searchString);

        SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            SearchViewModel model = new SearchViewModel();

            model.Subject = reader.GetValue(0).ToString();
            model.Body = reader.GetValue(1).ToString();

            lstModel.Add(model);

        }
        connection.Close();
        return true;
    }
    catch (Exception exc)
    {
        exc.ToString();
        return false;
    }
}

HomeController.cs

List<SearchViewModel> lstModel = new List<SearchViewModel>();

public ActionResult Index(SearchViewModel model)
{
    if (!ModelState.IsValid)
    {
        // There was a validation error => redisplay the view so 
        // that the user can fix it
        return View(model);
    }
    else
    {
        string searchString = model.Query;

        DataAccess.GetSearchData(searchString, out lstModel);

        return View(model); 
    }
}

Index.cs (Vue d'accueil)

@using (Html.BeginForm())
{
    @Html.LabelFor(x => Model.Query)
    @Html.EditorFor(x => x.Query)
    @Html.ValidationMessageFor(x => x.Query)
    <button type="submit">Search</button>
}

@if (Model.Query != null)
{
    <div class="results-panel" style="display:block;" )">
        <h4 class="card-title">@Model.Subject</h4>
        @Model.Body
    </div>
}

La chaîne de recherche est transmise à la fonction DataAccess qui remplit l'objet avec les données, mais l'objet s'affiche comme nul lorsque je le débogue dans la vue Home Index. Quelqu'un peut-il m'aider ? Je crois que je suis très près du but.

3voto

Andrew Reese Points 405

J'ai modifié ma fonction DataAccess pour qu'elle récupère une seule instance de l'objet plutôt qu'une liste. J'ai également fait en sorte que la propriété "Query" de SearchViewModel soit égale à la chaîne de recherche afin qu'elle ne soit pas nulle.

Mise à jour de DataAccess.cs

 public static bool GetSearchData(string searchString, out SearchViewModel searchModel)
        {
            searchModel = new SearchViewModel();

            try
            {
                SqlConnection connection = new SqlConnection(connectionString);
                connection.Open();

                SqlCommand command = connection.CreateCommand();

                command.CommandType = System.Data.CommandType.Text;

                command.CommandText = "select Subject, Body from TABLE where Subject = @subject ";
                command.Parameters.AddWithValue("@subject", searchString);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    searchModel = new SearchViewModel();

                    searchModel.Subject = reader.GetValue(0).ToString();
                    searchModel.Body = reader.GetValue(1).ToString();
                    searchModel.Query = searchString;

                }
                connection.Close();
                return true;
            }
            catch (Exception exc)
            {
                exc.ToString();
                return false;
            }
        }

Mise à jour de HomeController

        SearchViewModel searchModel = new SearchViewModel();

        public ActionResult Index(SearchViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
            else
            {
                string searchString = model.Query;

                DataAccess.GetSearchData(searchString, out searchModel);

                return View(searchModel); 
            }
        }

Ma division affiche maintenant les résultats appropriés lorsque je fais une recherche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X