Devolver un mensaje de error si no resultes se encuentran en la consulta de LINQ para el modelo

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

  •  21-12-2019
  •  | 
  •  

Pregunta

He construido una página de edición de la actualización de datos y funciona bien si el ID correcto se pasa pero cuando un ID no válido se pasa puedo obtener una excepción de referencia nula.Sé que esto es debido al hecho de la consulta de LINQ no encuentra los datos válidos de la base de datos, pero no estoy seguro de cómo lidiar con este menos que añadir un montón de IF declaraciones en mi opinión, para comprobar el valor null cada vez que la referencia del modelo.Este es el código que tengo actualmente para el controlador.

    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>
}
¿Fue útil?

Solución 2

La solución fue añadir un ELSE cláusula e inicializar una nueva, en blanco, de modelo.

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

Otros consejos

En el controlador ya está comprobando si section es null.Así, en el caso de que SE null acabo de volver de un diferente punto de vista que dice:"La sección No encontrado" o algo así.Además (como se sugiere aquí por @Aron) que podría volver 404 código de estado con este punto de vista, por lo que el controlador sería algo como esto:

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

Tenga en cuenta que mediante la devolución de un punto de vista diferente, que no regresan en una página diferente.Dirección URL de la misma, ya que se basa en el controlador no la vista.Por la representación de un punto de vista diferente a evitar tener que complicar el código de la vista, que normalmente muestra los datos.

BTW, evitar dar un "exceso" de información como "no Válido de la sección de IDENTIFICACIÓN", que se puede dirigir el potencial atacante dónde "poke" siguiente.

También me gustaría reorganizar el código para asignar valor a model sólo cuando la sección se encuentra y para el "no sección" ver usted, evidentemente, no es necesario pasar ningún modelo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top