Renvoi d'un message d'erreur si aucun résultat n'est trouvé dans la requête LINQ pour le modèle

StackOverflow https://stackoverflow.com//questions/21010334

  •  21-12-2019
  •  | 
  •  

Question

J'ai créé une page d'édition pour mettre à jour les données et cela fonctionne bien si l'ID correct est transmis, mais lorsqu'un ID non valide est transmis, j'obtiens une exception de référence nulle.Je sais que cela est dû au fait que la requête LINQ ne trouve aucune donnée valide dans la base de données, mais je ne sais pas comment gérer cela à moins d'ajouter un tas de IF à mon avis, pour vérifier la valeur null chaque fois que je fais référence au modèle.Voici le code que j'ai actuellement pour le contrôleur.

    public ActionResult EditSection(Int16 id = -1)
    {
        Section section = db.Sections.Find(id);
        SectionAddEditVM model = new SectionAddEditVM { Section = section };

        if (section != null)
        {
            if (section.Type == "Collection")
            {
                RedirectToAction("Collection", new { id = id });
            }

            model.SelectedType = section.Type;
            return View(model);
        }

        ModelState.AddModelError("Section ID", "Invalid Section ID");
        return View(model);
    }

Voir:

@model SectionAddEditVM

@{
    ViewBag.Title = "Edit " + Model.Section.Title + " Information";
}

<h2>
    Edit @Model.Section.Title Information
</h2>

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken();
    @Html.ValidationSummary(false)

    <p>
        @Html.HiddenFor(m => m.Section.ID)
        <label for="Title">Seciton Title:</label> @Html.EditorFor(m => m.Section.Title)
        <br />
        <label for="RouteName">Section Route:</label> @Html.EditorFor(m => m.Section.RouteName)
        <br />
        <label for="Type">Section Type:</label> @Html.DropDownListFor(m => m.Section.Type, new SelectList(Model.Type, "Value", "Text"))
        <br />
        @Html.HiddenFor(m => m.Section.LogoFileID)
        <label for="LogoFile">Logo Image:</label> <input id="LogoFile" name="LogoFile" type="file" />
        <br />
        <label for="Synopsis">Synopsis:</label> @Html.EditorFor(m => m.Section.Synopsis)
        <br />
        <input type="submit" value="Edit Information" />
    </p>
}
Était-ce utile?

La solution 2

La solution était d'ajouter un ELSE clause et initialiser un nouveau modèle vierge.

    public ActionResult EditSection(Int16 id = -1)
    {
        Section section = db.Sections.Find(id);

        if (section != null)
        {
            if (section.Type == "Collection")
            {
                RedirectToAction("Collection", new { id = id });
            }

            SectionAddEditVM model = new SectionAddEditVM { Section = section };
            model.SelectedType = section.Type;
            return View(model);
        }
        else
        {
            section = new Section();
            SectionAddEditVM model = new SectionAddEditVM { Section = section };

            ModelState.AddModelError("Section ID", "Invalid Section ID");
            return View(model);
        }
    }

Autres conseils

Dans votre contrôleur, vous vérifiez déjà si section est null.Donc, au cas où c'est le cas null renvoie simplement une vue différente qui dit :"Aucune section trouvée" ou quelque chose comme ça.De plus (comme suggéré ici par @Aron), vous pouvez revenir 404 code d'état avec cette vue, donc le contrôleur ressemblerait à ceci :

// find section based on ID
// ... actual code ...
if (section != null)
{
    // process data and assign to model
    return View(model);
}
else
{
    Response.StatusCode = (int) System.Net.HttpStatusCode.NotFound;
    return View("NoSectionFound");
}

Notez qu'en renvoyant une vue différente, vous ne renvoyez pas une page différente.L'URL est toujours la même, car elle est basée sur le contrôleur et non sur la vue.En rendant une vue différente, vous évitez d'avoir à compliquer le code dans la vue qui affiche normalement les données.

BTW, évitez de donner "trop" d'informations telles que "ID de section invalide", qui peuvent diriger un attaquant potentiel vers l'endroit où "pousser" ensuite.

Je réorganiserais également le code pour que vous attribuiez une valeur à model uniquement lorsque la section est trouvée et pour la vue "aucune section trouvée", vous n'avez évidemment pas besoin de transmettre de modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top