Holen Sie sich den aktuellen Controller im Blick

127

Ich habe eine, in View - _Editder lebt News M/V/C.

Ich verwende das V/Mvia the CategoryControlleras wieder:

return PartialView("/Views/News/_Edit.cshtml", model);

Wie View - _Editkann ich den Controller-Namen aus dem heraus benachrichtigen?

Wenn ich:

alert('@ViewContext. RouteData.Values["controller"].ToString()');

Der Wert lautet: News Die URL lautet jedoch:/Category/foobar

Gibt es eine Möglichkeit, den Wert 'Category'zu alarmieren? Vielen Dank

Valamas
quelle
du hast keine NewsController?
Jäger
Bitte posten Sie Ihre Aktion method, die das lädt partialviewund was controllerdarin methodvorhanden ist.
Jäger

Antworten:

193

Ich habe dies in meine Teilansicht aufgenommen:

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()

In der gleichen Situation, die Sie beschreiben, wird der in der URL beschriebene Controller (Kategorie für Sie, Produkt für mich) anstelle des tatsächlichen Speicherorts der Teilansicht angezeigt.

Verwenden Sie stattdessen diese Warnung:

alert('@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()');
Nicholas Sizer
quelle
25
Die Antwort unten von Palpie ist eine (leichter zu merkende) Abkürzung:@ViewContext.RouteData.Values["controller"]
Laoujin
6
Nur zu Ihrer Information, Sie müssen nicht bekommen HttpContext.Current. Requestist direkt verfügbar.
Serj Sagan
Ist es möglich, den vollständigen Namen der Controller-Klasse einschließlich des Namespace abzurufen? Es wäre auch cool, auch den Namen der Ansicht anzeigen zu können.
Johncl
3
Übrigens, ["action"]funktioniert, wenn Sie den Namen der Aktionsmethode möchten.
Zapnologica
117

Ich mache es so, aber vielleicht ist es nur ASP.NET MVC 4

@ViewContext.RouteData.Values["controller"]
Peter Hedberg
quelle
12
Beachten Sie, dass Ihre Lösung den Controller zurückgibt, der gerade ausgeführt wird. Wenn also ein Browser eine Anforderung für ControllerA stellt und ControllerA eine Teilansicht von ControllerB rendert, gibt Ihre Lösung den Namen von ControllerB zurück, während die Nicholas Sizer-Lösung den Namen von ControllerA zurückgibt.
Thomas CG de Vilhena
Sollte als beste Antwort akzeptiert werden. Dies funktioniert immer noch in ASP.NET Core 2.2
Tom
21

Erstellen Sie eine Basisklasse für alle Controller und geben Sie hier das Namensattribut ein:

public abstract class MyBaseController : Controller
{
    public abstract string Name { get; }
}

Im Hinblick auf

@{
    var controller = ViewContext.Controller as MyBaseController;
    if (controller != null)
    {
       @controller.Name
    }
}

Controller-Beispiel

 public class SampleController: MyBaseController 
    { 
      public override string Name { get { return "Sample"; } 
    }
Sel
quelle
Bitte erläutern Sie, wie die NameImmobilie eingestellt wird.
ErikE
13

Andere Möglichkeit, den aktuellen Controller-Namen in View abzurufen

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Vladimir Savinov
quelle
5

Benutz einfach:

ViewContext.Controller.GetType().Name

Dadurch erhalten Sie den gesamten Namen des Controllers

Fledermausspion
quelle
2

Sie befinden sich immer noch im Kontext Ihres Ordners, CategoryControllerobwohl Sie einen PartialViewaus Ihrem Views/NewsOrdner laden .

Jäger
quelle
0

Sie können einen der folgenden Codes verwenden, um den Controller-Namen abzurufen

@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();

Wenn Sie MVC 3 verwenden, können Sie verwenden

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
Sathish
quelle