Wenn ich den Zugriffsmodifizierer einer Controller-Klasse ändere, führt dies zu einem Fehler. Wenn ich die Barrierefreiheit einer Aktionsmethode nicht öffentlich mache, führt dies auch zu einem Fehler (speziell eine Seite nicht gefunden Fehler). Warum ist das der Fall?Warum müssen ASP.NET MVC Controller-Klassen öffentlich sein?
Antwort
Wenn Sie in der Standardeinstellung keinen Zugriffsmodifizierer für eine Klasse angeben, wird in C# standardmäßig internal
angegeben. Nur Code in derselben Assembly kann auf eine Klasse zugreifen, die internal
ist. Wenn Ihr Controller also internal
ist, müsste der Code, der beim Empfang einer Anforderung eine Controller-Instanz erstellt, in Ihrer Assembly enthalten sein.
Der Steuerungscode ist jedoch in der System.Web.Mvc
Assembly vorhanden und DefaultControllerFactory
ist standardmäßig für das Erstellen von Controllern zuständig. Wenn Ihr Code beispielsweise in der MvcApplication1-Assembly vorhanden ist, kann DefaultControllerFActory Ihre Controller-Klassen nicht ohne den Modifikator für den öffentlichen Zugriff finden, sodass sie nicht instanziiert werden kann.
Wenn Sie eine eng gekoppelte ASP.NET MVC-Anwendung erstellen möchten (für die es nicht bestimmt ist), dann könnten Sie es theoretisch folgendermaßen tun.
- Holen Sie den MVC-Quellcode, falls verfügbar.
- Dann bauen Sie Ihren Code in derselben Baugruppe.
- 1. Müssen virtuelle Destruktoren öffentlich sein?
- 2. Müssen Spring MVC-Klassen Thread-sicher sein
- 3. asp.net mvc Inhalt Ordner ist öffentlich, auch mit Formularauthentifizierung?
- 4. Warum müssen/müssen UI-Frameworks single-threaded sein?
- 5. Warum müssen Mat-Typen keine Zeiger sein?
- 6. Warum müssen Tabellennamen in Laravel plural sein?
- 7. Warum müssen Java Beans serialisierbar sein?
- 8. Warum die explizite Implementierung einer Schnittstelle nicht öffentlich sein kann?
- 9. Warum kann ein explizit implementiertes Mitglied nicht öffentlich sein?
- 10. Warum InitializeComponent öffentlich ist
- 11. ASP.NET MVC: Wie kann IPrincipal null sein?
- 12. Müssen Vektorelemente beweglich sein?
- 13. Java/Jython Hypothese: Konstruktor sollte öffentlich sein
- 14. ASP.NET MVC 2 - müssen UrlParameter.Optional Einträge am Ende der Route sein?
- 15. Warum asp.net MVC Leichtgewicht genannt?
- 16. ASP.NET MVC: Mehrere Kopien einer Site bereitstellen müssen
- 17. Warum ignoriert ASP.NET MVC meinen abschließenden Schrägstrich?
- 18. Warum ist java.io.Bits nicht öffentlich?
- 19. Warum die Abhängigkeitseigenschaften in WPF statisch sein müssen
- 20. Warum müssen die Überladungen von C# -Operatoren statisch sein?
- 21. Warum müssen Java-Objekte ein Vielfaches von 8 sein?
- 22. Warum .Net WPF DependencyProperties müssen statische Mitglieder der Klasse sein
- 23. Warum müssen Puffer mit fester Größe (Arrays) nicht sicher sein?
- 24. Warum Callback-Funktionen statisch sein müssen, wenn in Klasse
- 25. Android-Fragmente müssen statisch sein
- 26. Wie unterschiedlich müssen Zufallssamen sein?
- 27. Müssen Clustered-Indizes eindeutig sein?
- 28. Warum würden Sie ASP.NET MVC über SPA + ASP.NET WebAPI wählen?
- 29. Müssen ASP.NET MVC-Hilfsmethoden wie Html.DropDownList() die Ausgabe HTML codieren?
- 30. asp.net mvc - müssen einige Daten für die aktuelle Anfrage speichern
aber wenn ich Controller als intern machen dann sollte es Kompilierzeit Fehler generieren. Standardmäßig hat die Klasse einen internen Zugriffsmodifikator, weshalb der Code keinen Kompilierungsfehler zurückgibt. Meine Frage ist, dass, wenn ich Controller als intern mache, dann build erfolgreich, aber wenn ich Controller als geschützt intern mache, dann gibt es einen Kompilierungsfehler zurück. –
Compiler weiß nicht, dass Sie für MVC oder eine andere C# -Anwendung kompilieren. Es kompiliert nur wie folgt die Regeln. Regeln sagen, dass Sie interne Klassen auf Stammebene deklarieren können (innerhalb von Namespaces), aber Sie können keine geschützte interne Klasse auf Stammebene erstellen, aber Sie können eine geschachtelte Klasse mit internem Schutz erstellen. – dotnetstep