2015-06-19 5 views
5

In _Layout.cshtml ist es möglich zu bestimmen, was View in @RenderBody() gerendert wird?Ermitteln, welche Ansicht in @RenderBody gerendert wird()

+0

Was genau brauchen Sie? Es ist nicht ganz klar, was du meinst. –

+0

Möchten Sie verschiedene Ansichten basierend auf bestimmten Bedingungen rendern? –

+0

@AndreiV sagen wir, dass/Home/MyView Ich möchte "MyView" innerhalb _Layout.cshtml bekommen – gsharp

Antwort

11

Sie können die Ansicht (dh Index.cshtml) erhalten durch ((RazorView)ViewContext.View).ViewPath

Beispiel für Ihre Bedürfnisse:

<script type="text/javascript" src="~/Content/Scripts/@(Path.GetFileNameWithoutExtension(Server.MapPath(((RazorView)ViewContext.View).ViewPath))).js"></script> 

Wenn Sie Ihre aktuelle Ansicht benötigen (dh _Layout.cshtml), Sie können stattdessen VirtualPath verwenden.


Alte Antwort Ihre Kommentare lesen, möchten Sie ein

<script ...>...</script> 

je nach Ansicht hinzufügen, aber außerhalb von @RenderBody()?

setzen Dann

@RenderSection("Scripts", required:false) 

und in der Ansicht definieren den Abschnitt wie

@section Scripts { 
    <script ...>...</script> 
} 

Sie müssen also nicht Ihre _Layout.cshtml zu halten, da jede Ansicht ihre eigenen Skripts definiert. Hier

ist eine einfache Erklärung: http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor

+0

Ich weiß, dass ich das tun kann, aber es ist nicht das, was ich will .... Ich experimentiere nur, wie man index.js in die Ansicht index.cshtml (und detail.js in details.cshtml usw.) einfügt.) ohne manuelle Eingabe. meine Idee war, ein Stück Code in _layout.cshtml zu platzieren, das die Arbeit für mich tun wird ... und dafür muss ich die Ansicht kennen. – gsharp

+1

Ich habe gerade meine Antwort bearbeitet. Also, was willst du erreichen? – Matt

+0

Ich lese @Matt editierte Antwort und denke, das ist der einfachste Weg. –

0

Was Sie können tun, ist Html.ViewContext.RouteData.Values überprüfen. Das ist ein Wörterbuch mit Controller, Aktion und ID (falls nötig).

+0

Danke für Ihre Antwort. Leider muss ich die Ansicht und nicht die Aktion kennen. – gsharp

0

lesen this Artikel und es wird Ihr Problem zu lösen.

bearbeiten

Render

Was ist Render?

In Layoutseiten rendert der Teil einer Inhaltsseite, die nicht innerhalb eines benannten Abschnitts ist. [MSDN]

Wie funktioniert RenderBody (grafische Darstellung)? enter image description here

+0

RenderBody() hat keine überladene Methode, also kannst du offensichtlich nicht die Ansicht definieren, die du rendern willst. – Moh

0

The @RenderBody() macht die durch die Steuerung gesteuert Ansicht. also wenn dein Controller so ist.

public class HomeController : Controller 
    { 
     public ActionResult Index() // Renders File /Views/Home/Index.cshtml 
     { 
      return View(); 
     } 

    } 

Dann wird der public ActionResult Index()Index.cshtml wird die Ansicht, es int/Ansichten/Start-Ordner rendert.

Sie können zum Index hinzufügen.cshtml oder _Layout.cshtml Blick auf andere Ansichten oder partialViews zu machen Durch das Hinzufügen @Html.Partial("_MyView") wie unten dargestellt.

 @Html.Partial("_LayoutHeaderHeader") 
     @Html.Partial("_LayoutHeaderNavbar") 

Manchmal ist es einfach, ein paar Layoutseiten einzurichten, die aus verschiedenen Ansichten aufgerufen werden.

Wenn Sie Skripte für Sie aufrufen möchten, sollten Sie immer eine _PartialView erstellen und Ihre Skripte in der Teilansicht platzieren und diese Ansicht am unteren Rand Ihrer Ansicht wie diese aufrufen @Html.Partial("_MyView") und die Skripte werden richtig gesetzt.

Hier ist ein gutes Tutorial. http://www.codeproject.com/Articles/698246/ASP-NET-MVC-Special-Views-Partial-View-and-Layout

+0

Hallo Reich. Das funktioniert nicht, weil Sie View ("AnotherViewThatDoesntMatchTheActionName") zurückgeben können – gsharp

+0

Ich entschuldige mich, wenn ich die Frage gelesen habe, nahm ich an, dass Sie nach Details suchten, um zu wissen, welche Ansicht standardmäßig gerendert wird. –

0

Wenn Sie alle Ihre Modelle von einem Basismodell ableiten, dann könnten Sie eine Eigenschaft Ihnen Basismodell hinzufügen, die den Namen der Steuerung zurückgibt, die Sie

mit bekommen können

this.RouteData.Values["controller"].ToString();

Es wäre noch besser, Wenn Sie eine BaseController Klasse hätten, könnten Sie diese in den Konstruktor einfügen und müssen sie nie wieder anfassen.

Da Sie einen Nachkomme des Basismodells an Ihre Indexseite zurückgeben würden, die den Namen des Controllers hat, könnten Sie nun eine Schemabasis unter @Model.ControllerName verwenden. Wenn Ihr Controller mehrere Ansichten bedient, könnte die Eigenschaft aktualisiert werden, um einen bestimmten Ansichtsnamen anzugeben.

Ich glaube nicht, dass Sie den Namen eines Partials innerhalb des Index erhalten können, wenn Sie jquery verwenden und zu diesem Zeitpunkt die Seitenressourcen bereits geladen wurden.

Bearbeiten: Ein weiterer Trick wäre, Ihre eigene Version der @ Html.Partial() HtmlHelper-Klasse zu erstellen. So haben Sie @ Html.MyPartial ("ViewName") und innerhalb dieser Methode rufen Sie die interne Funktion, die generiert Html.Partial und dann injizieren Sie Ihre Abhängigkeiten.

+0

Ein weiterer Trick mit der HtmlHelper-Klasse wurde hinzugefügt. –

0

EDIT: Ich habe gerade Ihre Kommentare zu dem Thema gelesen und denke, dass der bessere Weg ist, den Code Snipplet von @Matt in einer anderen Antwort zur Verfügung gestellt.

Sie können die Anweisung @section in Ihrer Ansicht verwenden, um zu informieren, welches Skript geladen werden soll.

Layout-Vorlage Platzhalter

@RenderSection("scripts", required: false) 

Code anzeigen

@section scripts { 
    <script src="~/Scripts/custom-imgedit.js"></script> 
} 

Das obige Beispiel informieren, dass der benutzerdefinierten-imgedit.js wird im Abschnitt Platzhalter macht geladen werden. Hinweis: Sie können sogar Pakete wie @Scripts.Render ("~/bundles/myCustomScripts") verwenden.

Verwandte Themen