2013-08-12 20 views
8

W moim wspólnym layoucie chciałbym mieć sekcję "skrypty", aby wypchnąć ją wszystkimi skryptami potrzebnymi do działania strony.Użyj sekcji w częściowym widoku

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> 

Więc, moim zdaniem ładuje konkretny JavaScript i chcę go mieć w sekcji "scripts" i to działa.

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) 
} 

Wreszcie, moim zdaniem świadczy częściowe i mam JavaScript, który to częściowym obciążeniu.

_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} 

... i to nie roboczego - javascript tag NIE wygenerowana w sekcji "scripts"

Jak mogę to zrobić?

Odpowiedz

11

Jak omówiono w this question, nie jest możliwe użycie sekcje w częściowym widokiem:

sekcje nie działają w częściowym widokiem i to jest zgodne z projektem. Możesz użyć niektórych niestandardowych pomocników, aby osiągnąć podobne zachowanie, ale rzetelnie to obowiązek obejrzenia niezbędnych skryptów, a nie odpowiedzialności częściowej. Polecam, abyś użył sekcji @scripts w głównym widoku do tego i nie martwił się częściami o skrypty.

Powinieneś dodać odniesienie do skryptu do widoku głównego, który odwołuje się do częściowego.

+0

wyobraziłem to w międzyczasie; jednak zastanawiam się obecnie, czy to dobry projekt, czy nie ... – OzrenTkalcecKrznaric

+0

Czy masz na myśli to, czy odniesienie do skryptu w widoku głównym jest dobre? Jak myślisz, dlaczego tak nie jest? –

+0

Mam na myśli odniesienie do skryptu, którego wymaga zależność od dziecka. To może być zły projekt. – OzrenTkalcecKrznaric

3

To jest moja pierwsza odpowiedź!

Pracuję z webformami od lat, a teraz mam do czynienia z MVC 5. Ciężko.

Może to złe rozwiązanie, ale działa :)

W Layout.cshtml. dodać drugi odcinek "ScriptsPartial"

@RenderSection("ScriptsPartial", required: false) 

W Index.cshtml dodać "nowy ViewDataDictionary (ViewData) {{ "ViewPage" to}}"

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

W _AppSelector. cshtml, usunąć tę

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

W _AppSelecto r.cshtml, dodać to w dowolnym miejscu

@{ 
    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>"); 
     }); 
    } 
} 

Po prostu "wyślij" Widok na PartialView (bez właściwości Parent jak w WebForms?) i używać go do dodawania treści do sekcji "ScriptsPartial".

„ScriptsPartial” jest potrzebna, ponieważ DefineSection zgłasza błąd „odcinek już zdefiniowane: Skrypty”

Więc nie więcej niż jeden PartialView można użyć sekcji „ScriptsPartial” ... nie tak dobre rozwiązanie.

poważaniem,

Paco Ferre

Powiązane problemy