c# core - Wie setze ich Standard-Controller in asp.net MVC 4 & MVC 5




form post (5)

Legen Sie unter RouteConfig.cs im App_Start- Ordner den Code fest

public static void RegisterRoutes(RouteCollection routes)
{
 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 routes.MapRoute(
 name: "Default",
 url: "{controller}/{action}/{id}",
 defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional });
}

Wenn immer noch nicht funktioniert dann tun Sie die folgenden Schritte

Zweiter Weg: Sie folgen einfach den folgenden Schritten,

1) Klicken Sie mit der rechten Maustaste auf Ihre Projektlösung

2) Wählen Sie Eigenschaft

3) Wählen Sie Weboption und dann Spezifische Seite auswählen (Controller / Ansicht) und legen Sie Ihre Anmeldeseite fest

Hier ist Account mein Controller und Login ist meine Aktionsmethode (gespeichert im Account Controller)

Bitte werfen Sie einen Blick in die Anlage Bildschirmfoto.

Wie setze ich den Standard-Controller für mein ASP.NET MVC 4-Projekt, ohne HomeController zu erstellen ?

Wie sollte ich einen Standardbereich einrichten, wenn die Anwendung gestartet wird?


Wenn Sie nur einen Controller haben und auf jede Aktion auf root zugreifen möchten, können Sie den Controller-Namen wie folgt überspringen

routes.MapRoute(
        "Default", 
        "{action}/{id}", 
        new { controller = "Home", action = "Index", 
        id = UrlParameter.Optional }
);

Ich habe diese Frage nicht beantwortet:

Wie sollte ich einen Standardbereich einrichten, wenn die Anwendung gestartet wird?

So können Sie einen Standardbereich einrichten:

var route = routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    ).DataTokens = new RouteValueDictionary(new { area = "MyArea" });

Der beste Weg ist, Ihre Route zu ändern. Die Standardroute (definiert in Ihrem App_Start) setzt /Home/Index

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters*
        new { controller = "Home", action = "Index", 
        id = UrlParameter.Optional }
);

als Standardzielseite. Sie können dies ändern, um eine beliebige Route zu sein.

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters*
        new { controller = "Sales", action = "ProjectionReport", 
        id = UrlParameter.Optional }
);

Es gibt jetzt ein ELMAH.MVC-Paket in NuGet, das eine verbesserte Lösung von Atif enthält und auch einen Controller, der die Elmah-Schnittstelle innerhalb des MVC-Routings abwickelt (keine Notwendigkeit mehr, diese axd zu verwenden).
Das Problem mit dieser Lösung (und mit allen hier) ist, dass der Elmah-Fehlerhandler den Fehler tatsächlich behandelt und ignoriert, was Sie als customError-Tag oder durch ErrorHandler oder Ihren eigenen Fehlerhandler einrichten möchten
Die beste Lösung IMHO ist es, einen Filter zu erstellen, der am Ende aller anderen Filter agiert und die Ereignisse protokolliert, die bereits behandelt wurden. Das elmah-Modul sollte sich um die weiteren Fehler kümmern, die von der Anwendung nicht behandelt werden. Dies ermöglicht Ihnen auch, den Integritätsmonitor und alle anderen Module zu verwenden, die zu asp.net hinzugefügt werden können, um Fehlerereignisse anzuzeigen

Ich habe dies mit Reflektor auf den ErrorHandler in elmah.mvc geschrieben

public class ElmahMVCErrorFilter : IExceptionFilter
{
   private static ErrorFilterConfiguration _config;

   public void OnException(ExceptionContext context)
   {
       if (context.ExceptionHandled) //The unhandled ones will be picked by the elmah module
       {
           var e = context.Exception;
           var context2 = context.HttpContext.ApplicationInstance.Context;
           //TODO: Add additional variables to context.HttpContext.Request.ServerVariables for both handled and unhandled exceptions
           if ((context2 == null) || (!_RaiseErrorSignal(e, context2) && !_IsFiltered(e, context2)))
           {
            _LogException(e, context2);
           }
       }
   }

   private static bool _IsFiltered(System.Exception e, System.Web.HttpContext context)
   {
       if (_config == null)
       {
           _config = (context.GetSection("elmah/errorFilter") as ErrorFilterConfiguration) ?? new ErrorFilterConfiguration();
       }
       var context2 = new ErrorFilterModule.AssertionHelperContext((System.Exception)e, context);
       return _config.Assertion.Test(context2);
   }

   private static void _LogException(System.Exception e, System.Web.HttpContext context)
   {
       ErrorLog.GetDefault((System.Web.HttpContext)context).Log(new Elmah.Error((System.Exception)e, (System.Web.HttpContext)context));
   }


   private static bool _RaiseErrorSignal(System.Exception e, System.Web.HttpContext context)
   {
       var signal = ErrorSignal.FromContext((System.Web.HttpContext)context);
       if (signal == null)
       {
           return false;
       }
       signal.Raise((System.Exception)e, (System.Web.HttpContext)context);
       return true;
   }
}

Nun möchten Sie in Ihrer Filterkonfiguration so etwas tun:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //These filters should go at the end of the pipeline, add all error handlers before
        filters.Add(new ElmahMVCErrorFilter());
    }

Beachten Sie, dass ich dort einen Kommentar hinterlassen habe, um Leute daran zu erinnern, dass wenn Sie einen globalen Filter hinzufügen wollen, der die Ausnahme behandelt, VOR dem letzten Filter gehen sollte, sonst wird der Fall angezeigt, wo die unbehandelte Ausnahme von ElmahMVCErrorFilter ignoriert wird Es wurde nicht behandelt und es sollte vom Elmah-Modul geladen werden, aber dann markiert der nächste Filter die Ausnahme als behandelt und das Modul ignoriert sie, was dazu führt, dass die Ausnahme niemals in elmah übergeht.

Stellen Sie nun sicher, dass die Appsettings für elmah in Ihrer Webconfig etwa so aussehen:

<add key="elmah.mvc.disableHandler" value="false" /> <!-- This handles elmah controller pages, if disabled elmah pages will not work -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" /> <!-- This uses the default filter for elmah, set to disabled to use our own -->
<add key="elmah.mvc.requiresAuthentication" value="false" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.allowedRoles" value="*" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.route" value="errortracking" /> <!-- Base route for elmah pages -->

Der wichtigste hier ist "elmah.mvc.disableHandleErrorFilter", wenn dies falsch ist, wird der Handler in elmah.mvc verwendet, der die Ausnahme tatsächlich behandelt, indem er den Standard-HandleErrorHandler verwendet, der Ihre customError-Einstellungen ignoriert

Mit dieser Konfiguration können Sie Ihre eigenen ErrorHandler-Tags in Klassen und Ansichten festlegen, während Sie diese Fehler weiterhin über ElmahMVCErrorFilter protokollieren, eine customError-Konfiguration zu Ihrer web.config über das elmah-Modul hinzufügen und sogar Ihre eigenen Error-Handler schreiben. Sie müssen nur daran denken, keine Filter hinzuzufügen, die den Fehler vor dem von uns geschriebenen Elmah-Filter behandeln. Und ich habe vergessen zu erwähnen: keine Duplikate in Elmah.





c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5