2013-08-12 13 views
8

In meinem freigegebenen Layout möchte ich einen Abschnitt "Scripts" haben, um es mit allen Skripts stopfen, die für die Funktionalität der Seite benötigt werden.Verwenden Abschnitt in Teilansicht

Layout.cshtml

<html> 
<head> 
    <title>Test</title> 
    <script src="@Url.Content("~/Scripts/jquery-2.0.3.js")" type="text/javascript"> </script> 

    @RenderSection("Scripts", required: false) 

</head> 
<body> 
    @RenderBody() 
</body> 
</html> 

So lädt meine Ansicht nach einer bestimmten JavaScript aktiviert, und ich möchte es in "Skripte" Abschnitt sein, und es funktioniert.

Index.cshtml

@model PlatformaPu.Areas.Inventura.Models.Home.Index 

@section Scripts { 
    <script src="@Url.Content("~/Areas/Inventura/Scripts/Home/Index.js")" type="text/javascript"></script> 
} 

{CONTENT REMOVED FOR BREVITY} 

@section Footer { 
    @Html.Partial("~/Views/Shared/_AppSelector.cshtml", Model.AppSelector) 
} 

Schließlich macht meine Ansicht nach einem partiellen und ich habe einen Javascript, dass diese Teilladungen.

_AppSelector.cshtml

@model PlatformaPu.Models.Shared._AppSelector 

@section Scripts { 
    <script src="@Url.Content("~/Scripts/Shared/_AppSelector.js")" type="text/javascript"></script> 
} 

{CONTENT REMOVED FOR BREVITY} 

... und das ist NICHT arbeiten - JavaScript-Tags ist NICHT in "Skripte" Abschnitt gemacht

Wie kann ich das tun?

Antwort

11

Wie in this question diskutiert, ist es nicht möglich, Abschnitte in einer Teilansicht zu verwenden:

Abschnitte funktionieren nicht in Teilansichten und das ist von Entwurf. Sie können einige benutzerdefinierte Helfer verwenden, um ein ähnliches Verhalten zu erreichen, aber ehrlich gesagt liegt es in der Verantwortung der Ansicht, die notwendigen Skripte einzubeziehen, nicht die Verantwortung der Teilnehmenden. Ich würde Ihnen empfehlen, den Abschnitt @scripts der Hauptansicht zu verwenden, damit die Teilkritiker sich nicht um Skripts kümmern müssen.

Sie sollten den Skriptverweis der Hauptansicht hinzufügen, die auf den Teil verweist.

+0

ich dies in der Zwischenzeit herausgefunden; Allerdings frage ich mich derzeit, ob es ein gutes Design ist oder nicht ... – OzrenTkalcecKrznaric

+0

Meinst du, ob Referenzieren des Skripts in der Hauptansicht ist gutes Design? Warum denkst du, dass es nicht sein könnte? –

+0

Ich meine das Verweisen auf das Skript, das eine Kindabhängigkeit erfordert. Dies könnte ein schlechtes Design sein. – OzrenTkalcecKrznaric

3

Dies ist meine erste Antwort!

Ich arbeite seit Jahren mit Webforms und jetzt habe ich es mit MVC 5. Bit hart.

ist vielleicht die falsche Lösung, funktioniert aber :)

In Layout.cshtml. second "ScriptsPartial" -Abschnitt

@RenderSection("ScriptsPartial", required: false) 

In Index.cshtml, add "New Viewdatadictionary (Viewdata) {{ "Viewpage", dies}}"

@section Footer { 
    @Html.Partial("~/Views/Shared/_AppSelector.cshtml", Model.AppSelector, new ViewDataDictionary(ViewData) { { "ViewPage", this } }) 
} 

In _AppSelector. cshtml, entfernen Sie diese

@section Scripts { 
    <script src="@Url.Content("~/Scripts/Shared/_AppSelector.js")" type="text/javascript"></script> 
} 

In _AppSelecto r.cshtml, fügen Sie diese in jedem Ort

@{ 
    if (ViewData.ContainsKey("ViewPage")) 
    { 
     System.Web.Mvc.WebViewPage viewPage = (System.Web.Mvc.WebViewPage)ViewData["ViewPage"]; 

     viewPage.DefineSection("ScriptsPartial",() => 
     { 
      // viewPage.Write(Scripts.Render("~/AppSelector/Scripts")); // If you use a Bundle 
      viewPage.WriteLiteral("<script src=\"" + Url.Content("~/Scripts/Shared/_AppSelector.js") + "\" type=\"text/javascript\"></script>"); 
     }); 
    } 
} 

einfach auf „senden“, um den Blick auf die PartialView (keine Parent-Eigenschaft wie in WebForms?) und es verwendet, Inhalte zu „ScriptsPartial“ Abschnitt hinzuzufügen.

„ScriptsPartial“ benötigt wird, weil DefineSection einen Fehler wirft „Abschnitt bereits definiert: Scripts“

Also, nicht mehr als ein PartialView „ScriptsPartial“ Abschnitt verwenden kann ... nicht so gute Lösung.

Mit freundlichen Grüßen,

Paco Ferre