0
votes

MVC5 Comment filtrer pour 'égal ou inférieur à "dans le contrôleur

Je suis assez nouveau sur MVC5 et C #. J'ai une vue (liste) des fournitures. Je veux faire un filtre sur un champ Int 'on Thant'. Où, l'utilisateur peut entrer un numéro dans la zone de texte du filtre et nous ramenons toutes les fournitures égales ou inférieures au numéro spécifié.

Voici la partie pertinente de ma vue: P>

public ActionResult Reorder(string searchString, int? page)
{
    var supplies = db.ICS_Supplies
        .OrderByDescending(g => g.Supplies_ID)
        .ToList();

    var catalogs = supplies
        .Where(s => 
            s.OnHand.HasValue &&
            (searchString == null || s.OnHand.Value <= int.Parse(searchString)));

    var pageNumber = page ?? 1;

    return View(catalogs.ToPagedList(pageNumber, 10));
}


12 commentaires

hasvalue renvoie true S'il y a une valeur, et est uniquement applicable à un type nullable (vous indiquez que OnBehand est un int , mais il doit être un int? ). Pour le comparer à une chaîne , vous devez convertir la chaîne en un int . Donc, vous finiriez avec quelque chose comme: fournitures.au (s => s.onhand.hasvalue && recherchetring! = Null && s.value <= int.parse (recherchetring))


Ou si vous souhaitez renvoyer des valeurs si searchstring est null , ce serait s.onhand.hasvalue && (recherchetring == null || s.value <= int.parse (recherchetring)) . Bien que int.parse lancera une exception si searchstring n'est pas un int , donc en utilisant tryparse serait mieux.


@Rufusl. Merci pour votre réponse. J'entends ce que vous dites. J'ai essayé d'implémenter Var Catalogs = Fournitures.Où (S => S.onhand.hasvalue && (Searchstring == null || S.Value <= int.parse (Searchstring)); et je vois deux erreurs. 1 Moi qu'il n'y a pas de définition pour la valeur. Et puis (2) que ChercheurString ne peut pas convertir de INT en chaîne.


@Rufusl - j'ai résolu la recherche de SearchString de Int à la chaîne. Mais toujours la question «sans définition de valeur»


Le temps est un champ Int


Je ne suis pas sûr. Ce que je peux vous dire, c'est que Soehand est un champ INT, et je viens de mettre à jour ma question initiale pour vous montrer le code de contrôleur complet avec les modifications.


Avec le code mis à jour. Il ne s'agit pas de "s.value <= int.parse (SearchString))"


Je suis vraiment désolé. C'est int? pas int. Public int? Onan {obtenir; ensemble; }


Je suis aussi désolé - il devrait être s.onhand.value ... :)


D'accord, cela a emporté l'erreur de construction. . Et la vue est chargée, mais le filtre ne fonctionne pas. Peu importe quel numéro je saisis dans la zone de texte Searchstring. . Il ramène toujours tous les enregistrements, pas seulement ceux avec l'Email.Value d'égale ou inférieure à la recherche.


Lors de l'analyse d'une chaîne dans un entier, il est généralement préférable d'utiliser Tryparse () et vérifiez le résultat afin d'éviter de lancer une exception. Je suis également confondu de la raison pour laquelle vous convertissez pagenumber en une chaîne, puis l'analyser dans un entier, il n'est jamais vraiment utilisé comme une chaîne?


Et êtes-vous certain que la chaîne n'est pas null lorsque la requête est exécutée? C'est le seul cas que je peux voir où il retournerait tous les enregistrements.


3 Réponses :


1
votes

condensation de notre conversation en une réponse, vous avez indiqué que vous avez un problème avec cette ligne de code:

var catalogs = supplies.Where(s => s.OnHand.HasValue && s.OnHand.Value <= searchValue)


2 commentaires

C'est une bonne réponse, comme une légère amélioration, je recommanderais qu'il met à jour sa forme à utiliser: Recherche fournitures: . Cela supprimerait la nécessité d'analyser entièrement la variable de recherche.


Merci Rufus L, pour tout le temps et les efforts que vous avez mis dans cela. Votre réponse m'aide à comprendre ce qui se passe et pourquoi, et je l'apprécie beaucoup. Le filtre fonctionne maintenant. Et je vais marquer cela comme résolu. Il y a toujours un problème avec la pagination. Lorsque je vais à la page suivante des résultats, le filtre échoue et tous les résultats montrent à nouveau, quel que soit le filtre. Mais je vais commencer cela comme une nouvelle question. Merci!



0
votes

Ce n'est pas la réponse ... mais destiné à vous aider, c'est difficile à lire ... xxx pré>

Cela nécessite plus de travail mais est plus facile à lire ... et espère Il vous aide P>

 public ActionResult Reorder(string searchString, int? page)
    {
        /check your string first
        if(searchString == null)
           searchString = "";

        ///from the below im guessing searchString is an int
        var int value = int.Parse(searchString);

        var supplies = db.ICS_Supplies.Where(x => x.OnHand != null 
                                && searchString.Contians(x.FieldName) 
         .OrderByDescending(x => x.Supplies_ID)
         .ToList(); // to list forces a pull of the results

       //other stuff to work on
        var pageNumber = page ?? 1;
        return View(catalogs.ToPagedList(pageNumber, 10));

    }


0 commentaires

0
votes
public ActionResult Reorder(string searchString, int? page)
{   
int convertInt = 0;

var catalogs = db.ICS_Supplies
        .OrderByDescending(g => g.Supplies_ID)
        .ToList();

if (Int32.TryParse(searchString, out convertInt))
{
   catalogs = supplies
            .Where(s => 
                s.OnHand.HasValue &&
                s.OnHand.Value <= convertInt);
}
 var pageNumber = page ?? 1;

 return View(catalogs.ToPagedList(pageNumber, 10));
}

0 commentaires