Возврат сообщения об ошибке, если в запросе LINQ для модели не найдены результаты.

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

  •  21-12-2019
  •  | 
  •  

Вопрос

Я создал страницу редактирования для обновления данных, и она работает нормально, если передается правильный идентификатор, но когда передается неверный идентификатор, я получаю исключение нулевой ссылки.Я знаю, что это связано с тем, что запрос LINQ не находит никаких действительных данных в базе данных, но я не знаю, как с этим справиться, если я не добавлю кучу IF на мой взгляд, проверять на ноль каждый раз, когда я ссылаюсь на модель.Вот код, который у меня сейчас есть для контроллера.

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

Вид:

@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>
}
Это было полезно?

Решение 2

Раствор должен был добавить статью ELSE и инициализировать новую, пустую модель.

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

Другие советы

В вашем контроллере вы уже проверяете, если section является null.Итак, в случае, если это ЕСТЬ null просто верните другое представление, в котором говорится:"Раздел не найден" или что-то в этом роде.Кроме того (как предложено здесь @Aron) вы можете вернуть 404 код состояния с этим представлением, поэтому контроллер будет выглядеть примерно так:

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

Обратите внимание: возвращая другое представление, вы не возвращаете другую страницу.URL-адрес остался прежним, поскольку он основан на контроллере, а не на представлении.Отрисовывая другое представление, вы избегаете необходимости усложнять код представления, которое обычно отображает данные.

Кстати, избегайте предоставления «слишком большого количества» информации, такой как «Неверный идентификатор раздела», которая может направить потенциального злоумышленника туда, куда «тыкать» дальше.

Я бы также изменил код, чтобы вы присвоили значение model только когда раздел найден и для представления «раздел не найден», вам, очевидно, не нужно передавать какую-либо модель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top