كيفية جعل مسار الصيد كله للتعامل مع استفسارات "404 صفحة غير موجودة" لـ ASP.NET MVC؟

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

سؤال

هل من الممكن إنشاء مسار نهائي يمسك كل شيء .. ويعود المستخدم إلى عرض 404 في ASP.NET MVC؟

ملاحظة: لا أريد إعداد هذا في إعدادات IIS الخاصة بي.

هل كانت مفيدة؟

المحلول

وجدت الجواب بنفسي.

ريتشارد دينغوال لديه وظيفة ممتازة تمر من خلال استراتيجيات مختلفة. أنا أحب بشكل خاص حل filterattribute. أنا لست من محبي رمي الاستثناءات حول ويلي نايلي ، لذلك سأرى ما إذا كان بإمكاني تحسين ذلك :)

لـ Global.asax ، فقط أضف هذا الرمز كأخير طريقك للتسجيل:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );

نصائح أخرى

جاء هذا السؤال أولاً ، لكن الإجابة الأسهل جاءت في سؤال لاحق:

التوجيه لصفحة خطأ ASP.NET MVC 404

لقد حصلت على خطأ في التعامل مع العمل عن طريق إنشاء errorcontroller الذي يعيد طرق العرض في هذه المقالة. اضطررت أيضًا إلى إضافة "Catch All" إلى الطريق في Global.asax.

لا أستطيع أن أرى كيف سيصل إلى أي من صفحات الأخطاء هذه إذا لم يكن في الويب. كان على web.config تحديد:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

ثم أضفت أيضًا:

error statusCode="404" redirect="~/Error/NotFound"

أتمنى أن يساعدك هذا.

أنا أحب بهذه الطريقة الآن لأن الأمر بسيط للغاية:

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>

كما يمكنك التعامل مع خطأ غير موجود في global.asax.cs على النحو التالي

protected void Application_Error(object sender, EventArgs e)
{
    Exception lastErrorInfo = Server.GetLastError();
    Exception errorInfo = null;

    bool isNotFound = false;
    if (lastErrorInfo != null)
    {
        errorInfo = lastErrorInfo.GetBaseException();
        var error = errorInfo as HttpException;
        if (error != null)
            isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
    }
    if (isNotFound)
    {
        Server.ClearError();
        Response.Redirect("~/Error/NotFound");// Do what you need to render in view
    }
}

أضف هذه الخطوط ضمن ملف Root Web.Config الخاص بك.

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>

قد تكون هذه مشكلة عند استخدامك

throw new HttpException(404);

عندما تريد التقاط ذلك ، لا أعرف أي طريقة أخرى ثم تحرير تكوين الويب الخاص بك.

بديل لإنشاء طريق تم اصطياده هو إضافة ملف Application_EndRequest طريقة لك MvcApplication لكل إجابة ماركو أفضل من MVC 404.

داخل RouterConfig.cs أضف قطعة رمز follwing:

  routes.MapRoute(
           name: "Error",
           url: "{id}",
           defaults: new
           {
               controller = "Error",
               action = "PageNotFound"

           });

إذا تعذر حل المسار ، فسيتم إطار عمل MVC من خلال 404 خطأ .. أفضل طريقة هي استخدام مرشحات الاستثناء ... إنشاء استثناء مخصص وجعل مثل هذا ..

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top