In _Layout.cshtml
è possibile determinare quale vista verrà resa in @RenderBody()
?Determina quale vista verrà resa in @RenderBody()
risposta
È possibile ottenere la vista (cioè Index.cshtml) attraverso ((RazorView)ViewContext.View).ViewPath
Esempio per le vostre esigenze:
<script type="text/javascript" src="~/Content/Scripts/@(Path.GetFileNameWithoutExtension(Server.MapPath(((RazorView)ViewContext.View).ViewPath))).js"></script>
Se è necessario il reale Vista (cioè _Layout.cshtml), puoi invece usare VirtualPath
.
Vecchio risposta leggere i vostri commenti, si desidera aggiungere un
<script ...>...</script>
in base alla vista, ma al di fuori di @RenderBody()
?
Poi mise
@RenderSection("Scripts", required:false)
e nella vista definiscono la sezione come
@section Scripts {
<script ...>...</script>
}
Quindi non è necessario per mantenere il vostro _Layout.cshtml poiché ogni View definisce i propri script.
Ecco una spiegazione semplice: http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor
So che posso farlo, ma non è quello che voglio .... Sto solo sperimentando su come includere index.js nella vista index.cshtml (e detail.js in detail.cshtml e così via ..) senza alcuna digitazione manuale. la mia idea era quella di inserire un pezzo di codice in _layout.cshtml che funzionasse per me ... e per questo ho bisogno di conoscere il punto di vista .. – gsharp
Ho appena modificato la mia risposta. Quindi, questo, cosa vuoi ottenere? – Matt
Ho letto @Matt risposta modificata e penso che questo sia il modo più semplice. –
Cosa si può fare è controllare Html.ViewContext.RouteData.Values
. Questo è un dizionario con controller, azione e id (se necessario).
Grazie per la risposta. Purtroppo ho bisogno di conoscere la vista e non l'azione. – gsharp
Leggi this articolo e sarà risolvere il tuo problema.
Modifica
RenderBody
cosa è RenderBody?
Nelle pagine di layout, rende la parte di una pagina di contenuto che non è all'interno di una sezione denominata. [MSDN]
Come funziona RenderBody (presentazione grafica)?
RenderBody() non ha alcun metodo sovraccarico, quindi ovviamente non puoi definire la vista che vuoi rendere. – Moh
Il @RenderBody()
rende la vista controllata dal controllore. quindi se il tuo controller è così.
public class HomeController : Controller
{
public ActionResult Index() // Renders File /Views/Home/Index.cshtml
{
return View();
}
}
Poi il public ActionResult Index()
Index.cshtml sarà la vista che renderà situato int cartella/Vista/Casa.
È possibile aggiungere all'indice .cshtml o _Layout.cshtml vista renderizzare altri Vista o partialViews Aggiungendo @Html.Partial("_MyView")
come mostrato di seguito.
@Html.Partial("_LayoutHeaderHeader")
@Html.Partial("_LayoutHeaderNavbar")
A volte è facile impostare alcune pagine di layout per chiamare da Visualizzazioni diverse.
Se si desidera chiamare script per visualizzare, è necessario creare sempre una _PartialView e posizionare gli script nella vista parziale e chiamare tale vista nella parte inferiore della vista come @Html.Partial("_MyView")
e gli script verranno impostati correttamente.
Ecco un buon tutorial. http://www.codeproject.com/Articles/698246/ASP-NET-MVC-Special-Views-Partial-View-and-Layout
Ciao ricco. Non funzionerà perché puoi fare return View ("AnotherViewThatDoesntMatchTheActionName") – gsharp
Mi scuso, quando leggo la domanda ho pensato che stavi cercando i dettagli per sapere quale vista è resa per default. –
Se si deriva tutti i modelli di un modello base, allora si potrebbe aggiungere una proprietà a voi modello di base che restituisce il nome del controller, che è possibile ottenere utilizzando
this.RouteData.Values["controller"].ToString();
Sarebbe ancora meglio se avevi una classe BaseController
perché potresti metterla nella funzione di costruzione e non doverla mai più toccare.
Poiché si restituirebbe un discendente del modello di base alla pagina dell'indice che ha il nome del controllore, ora è possibile utilizzare una base di schema su @Model.ControllerName
. Se il controller gestisce più viste, la proprietà potrebbe essere aggiornata per indicare un determinato nome di visualizzazione.
Non penso che si possa ottenere il nome di un partial all'interno dell'indice a meno che non si usi jquery e da quel momento le risorse della pagina siano già state caricate.
Modifica: Un altro trucco sarebbe quello di creare la propria versione della classe HtmlHelper @ Html.Partial(). Quindi hai @ Html.MyPartial ("ViewName") e all'interno di quel metodo chiama la funzione interna che genera Html.Partial e quindi le tue dipendenze.
Aggiunto un altro trucco usando la classe HtmlHelper. –
EDIT: Ho appena letto i vostri commenti sul problema e penso che il modo migliore sia utilizzare lo snipplet di codice fornito da @Matt in un'altra risposta.
È possibile utilizzare l'istruzione @section all'interno della propria vista per informare quale script deve essere caricato.
layout del modello segnaposto
@RenderSection("scripts", required: false)
Visualizza codice
@section scripts {
<script src="~/Scripts/custom-imgedit.js"></script>
}
L'esempio sopra informiamo che i custom-imgedit.js verranno caricati nel segnaposto sezione di rendering. Nota: puoi anche utilizzare pacchetti come @ Scripts.Render ("~/bundles/myCustomScripts")
Di cosa hai bisogno esattamente? Non è chiaro cosa intendi. –
Vuoi rendere diverse viste in base ad alcune condizioni? –
@AndreiV diciamo che avere/Home/MyView Voglio ottenere "MyView" all'interno di _Layout.cshtml – gsharp