2 votes

ASP.NET MVC C# Aide à la recherche

Je dispose du code suivant dans mon HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using MyApplication.Models;

namespace MyApplication.Controllers
{
    public class HomeController : Controller
    {
        private NewsDBEntities _db = new NewsDBEntities();

        //
        // GET: /Home/

        public ActionResult Index()
        {

            return View(_db.ArticleSet.ToList());

        }

        //
        // GET: /Home/Details/5

        public ActionResult Details(int id)
        {
            //return View();

            var ArticleToView = (from m in _db.ArticleSet

                               where m.storyId == id

                               select m).First();

            return View(ArticleToView);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(String query)
        {

            var ArticleQuery = (from m in _db.ArticleSet

                                where m.headline.Contains(query)

                                select m).First();

            return View(ArticleQuery);

            //return RedirectToAction("Search");

        }

    }
}

Dans mon dossier de vues sous Home/Index.aspx, j'ai un formulaire de recherche simple comme suit :

    <% using (Html.BeginForm()) {%>

            Recherche

                Mots-clés:
                <%= Html.TextBox("query") %>

    <% } %>

L'idée est que lorsque l'utilisateur soumet ce formulaire, le contenu de la zone de texte de requête sera utilisé puis vérifié par rapport au titre d'un article provenant de ma base de données et la vue Index, au lieu de montrer tous les articles, montrera uniquement ceux qui correspondent à la requête tapée par l'utilisateur.

Lorsque je soumets le formulaire, j'obtiens l'erreur suivante :

L'élément de modèle passé dans le dictionnaire est de type 'MyApplication.Models.Article' mais ce dictionnaire requiert un élément de modèle de type 'System.Collections.Generic.IEnumerable`1[MyApplication.Models.Article]'.

Qu'est-ce que j'ai mal fait ici ? Car de ce que je peux comprendre, le code est correct.

2voto

BFree Points 46421

Il semble que dans votre View vous avez Inherits="System.Web.Mvc.ViewPage>" alors que vous ne lui passez qu'un seul élément. Remplacez IEnumerable par un seul élément, ou supprimez le .First().

1voto

XSaint32 Points 1209

Votre vue est fortement typée sur une collection de MyApplication.Models.Article. Vous ne pouvez pas passer un seul MyApplication.Models.Article dans la vue.

1voto

Dave Swersky Points 25958

La vue que vous transmettez est une vue fortement typée de 'System.Collections.Generic.IEnumerable1[MyApplication.Models.Article]'. Changez soit le type de la vue, ou transmettez une collection IEnumerable d'articles à la vue.

1voto

XSaint32 Points 1209

Comment puis-je afficher un compteur du nombre d'articles retournés après la recherche et quelle était la requête. Et aussi le cacher et le montrer en fonction de si l'utilisateur a effectué une recherche ou non.

Je recommanderais d'utiliser un ViewModel personnalisé pour fournir à la Vue toutes les informations nécessaires à afficher à l'utilisateur.

public class SearchResultViewModel {
   public IEnumerable Articles { get; set; }
   public string SearchText { get; set; }
}

Dans votre contrôleur, vous créeriez une nouvelle instance de ce modèle et le rempliriez en conséquence.

Ensuite, vous typerez fortement votre vue sur SearchResultViewModel et l'utiliserez au besoin :

  1. Nombre de résultats : <%: Model.Articles.Count() %>
  2. Texte de recherche : <%: Model.SearchText %>

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