Restituzione di un messaggio di errore se non risulta risulta in query LINQ per il modello
-
21-12-2019 - |
Domanda
Ho creato una pagina di modifica per aggiornare i dati e funziona correttamente se viene trasmesso l'ID corretto, ma quando viene trasmesso un ID non valido, ottengo un'eccezione di riferimento null.So che questo è dovuto al fatto che la query LINQ non trova dati validi dal database, ma non sono sicuro di come affrontare questo a meno che non aggiunga un sacco di istruzioni generali di generazioneGode a mio avviso di controllare il controllo di NULL ogni volta che faccio riferimento almodello.Ecco il codice che ho attualmente per il controller.
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);
}
.
Vista:
@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>
}
. Soluzione 2
La soluzione era aggiungere una clausola ELSE
e inizializzare un nuovo, vuoto, modello.
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);
}
}
. Altri suggerimenti
Nel tuo controller che stai già controllando se section
è null
.Quindi, nel caso in cui è generatodicetagcode restituisca una visione diversa che dice: "Nessuna sezione trovata" o qualcosa del genere.Inoltre (come suggerito qui da @aron) è possibile restituire il codice di stato null
con questa vista, quindi il controller sembrerebbe qualcosa del genere:
// 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");
}
.
Si noti che restituire una visione diversa, non stai restituendo una pagina diversa.URL è ancora lo stesso, dal momento che si basa sul controller non è la vista.Rendendo una visione diversa si evita di dover complicare il codice nella vista che normalmente visualizza i dati.
btw, evita di dare "troppe informazioni" come "ID sezione non valido" che può dirigere il potenziale utente malintenzionato a dove "POKE".
Riorganizzerei anche il codice in modo da assegnare il valore a 404
solo quando viene trovata la sezione e per la selezione "Nessuna sezione trovata", ovviamente non è necessario passare alcun modello.