إرجاع رسالة خطأ في حالة عدم العثور على نتائج في استعلام 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