Rückgabe einer Fehlermeldung, wenn in der LINQ-Abfrage für das Modell keine Ergebnisse gefunden werden

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

  •  21-12-2019
  •  | 
  •  

Frage

Ich habe eine Bearbeitungsseite erstellt, um Daten zu aktualisieren, und sie funktioniert einwandfrei, wenn die richtige ID übergeben wird, aber wenn eine ungültige ID übergeben wird, erhalte ich eine Nullreferenzausnahme.Ich weiß, dass dies daran liegt, dass die LINQ-Abfrage keine gültigen Daten aus der Datenbank findet, aber ich bin mir nicht sicher, wie ich damit umgehen soll, es sei denn, ich füge eine Reihe von hinzu IF anweisungen aus meiner Sicht, um jedes Mal, wenn ich auf das Modell verweise, auf Null zu prüfen.Hier ist der Code, den ich derzeit für den Controller habe.

    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);
    }

Blick:

@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>
}
War es hilfreich?

Lösung 2

Die Lösung bestand darin, eine hinzuzufügen ELSE klausel und initialisiere ein neues, leeres Modell.

    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);
        }
    }

Andere Tipps

In Ihrem Controller prüfen Sie bereits, ob section is null.Also, falls es so ist null geben Sie einfach eine andere Ansicht zurück, die besagt:"Kein Abschnitt gefunden" oder so.Zusätzlich (wie hier von @Aron vorgeschlagen) könnten Sie zurückkehren 404 statuscode mit dieser Ansicht, also würde der Controller ungefähr so aussehen:

// 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");
}

Beachten Sie, dass Sie durch die Rückgabe einer anderen Ansicht keine andere Seite zurückgeben.Die URL ist immer noch dieselbe, da sie auf dem Controller und nicht auf der Ansicht basiert.Durch das Rendern einer anderen Ansicht vermeiden Sie, den Code in der Ansicht zu komplizieren, in der normalerweise die Daten angezeigt werden.

Übrigens, vermeiden Sie es, "zu viele" Informationen wie "Ungültige Abschnitts-ID" anzugeben, die potenzielle Angreifer dazu bringen können, wohin sie als nächstes "stoßen" sollen.

Ich würde den Code auch neu anordnen, damit Sie ihm einen Wert zuweisen model nur wenn ein Abschnitt gefunden wurde und für die Ansicht "Kein Abschnitt gefunden", müssen Sie offensichtlich kein Modell übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top