/ / ActionFilterAttribute-Aufrufreihenfolge - c #, asp.net-mvc, asp.net-mvc-5, actionfilterattribute

ActionFilterAttribute-Bereichsaufrufreihenfolge - c #, asp.net-mvc, asp.net-mvc-5, actionfilterattribute

Ich habe ein Problem mit der Aufrufreihenfolge meines ActionFilter.

Ich habe einen Filter erstellt, der das Layout MasterName festlegt:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class MasterNameAttribute : ActionFilterAttribute
{
public String MasterName { get; set; }

public MasterNameAttribute(String masterName)
{
this.MasterName = masterName;
}

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
viewResult.MasterName = this.MasterName;

Ich habe es in meinem Controller folgendermaßen verwendet:

[MasterName("_Layout_Main")]
public partial class ProjectController : BaseController
{
[MasterName("_Layout_Special")]
public ActionResult Dashboard()
{

Nein, ich habe das Problem, dass ASP MVC die Filter der Reihe nach aufruft Aktionsbereich -> Methodenbereich. Ich möchte aber, dass der Method-Scope-Filter das Ergebnis ist und den Controller-Scope-Filter außer Kraft setzt.

Meine Frage:

  1. In der MSDN wird geschrieben, dass die Filter in der Enum-Wertereihenfolge von "AttributeTargets" aufgerufen werden Enum (Class = 4, Method = 0x40). Warum wird der Controller-Scope-Filter als letzter aufgerufen?
  2. Wie kann ich mein Bestellproblem lösen, ohne die Eigenschaft "Bestellung" zu verwenden? Ist der richtige Weg zu erkennen, ob ein Methode-Scope-Filter vom Typ samt vorhanden ist?

Hinweise

.ControllerDescriptor.IsDefined(...

Hat mir nicht geholfen, weil mein echt istDie Implementierung hat einige Bedingungen, wenn der MasterName vom Filter festgelegt wird oder nicht. Das Finden des Method-Scope-Attributs sagt also nicht aus, ob der Filter verwendet wurde oder nicht und ob der Controller-Scope-Filter verwendet werden soll oder nicht (nur wenn der Method-Scope-Filter nicht verwendet wurde). Ich denke, eine richtige Anrufreihenfolge wäre die beste Lösung.

Ähnlich wie bei @swapneel answers:

Nein, das passt nicht zu meinen Bedürfnissen. Ich habe eine sehr komplexe Layoutauswahl, die am besten durch Attribute festgelegt wird. Ich brauche Vererbung, Überschreiben und Auftragslogik.

Mögen:

[MasterName("_Layout1", Host = "sub1.domain.com")]
[MasterName("_Layout2", Host = "sub2.domain.com")]
[MasterName("_Layout3", Host = "sub3.domain.com")]
public partial class ProjectController : BaseController
{
[MasterName("_Layout_1_1", Host = "sub1.domain.com")]
[MasterName("_Layout_2_1", Host = "sub2.domain.com")]
public ActionResult Dashboard()
{

Hier ein Action-Aufruf "Dashboard" mit Host "₂.domain.com "sollte den Controller" _Layout2 "MasterName mit" _Layout2_1 "überschreiben. Bei allen anderen Aktionen wird er nicht überschrieben und" _Layout2 "ist der aktive.

Grüße Steffen!

Antworten:

0 für die Antwort № 1

Das mag nicht mit Ihrer Frage zusammenhängen, aber ich denke

Wenn Sie für jede Ansicht eine oder eine andere Masterseite festlegen möchten Zeit oder zur Entwurfszeit. Sie können verwenden _ViewStart.cshtml.


Der _ViewStart.Die cshtml-Datei wird zu Beginn des Renderns jeder Ansicht ausgeführt. Jeder Code, der im Codeblock dieser Datei enthalten ist, wird vor jedem Code in der Ansicht ausgeführt. Normalerweise legt diese Datei die Layoutvorlage fest, die von den Ansichten in der Anwendung:

@{
Layout = "~/Views/Shared/_Layout.cshtml";
}

Eine MVC-Anwendung kann mehrere haben _ViewStart.cshtml Dateien. Die Reihenfolge, in der diese Dateien ausgeführt werden, hängt vom Speicherort der Dateien in der Ordnerhierarchie und der jeweiligen Ansicht ab. Die MVC Runtime führt den Code zuerst in der aus _ViewStart.cshtml Datei im Stammverzeichnis des Views-Ordners. Anschließend arbeitet es sich in der Ordnerhierarchie nach oben und führt den Code in jeder aus _ViewStart.cshtml Datei, die es auf dem Weg findet. Zum Beispiel, wenn wir hätten_ViewStart.cshtml Dateien an den folgenden Speicherorten:

Kopierter Text von diesem Link - Was-ist-der-Zweck-der-viewstartcshtml-Datei-und-wie-ist-es-it-it