Inkludert Javascript og CSS i Master sider og Brukerkontroller i asp.net

stemmer
1

Jeg prøver å inkludere JS og CSS i koden min bak i min hoveddokumenter og brukerkontroller i Page_Load hendelsen.

Men tydeligvis, JS pauser siden Page_Load av brukeren styrer masse FØR Page_Load av en malside. Jeg har mine jQuery libs brukes på tvers av området i min malsider, men skript som brukes i brukerkontroll er inkludert i brukerkontroll bare. Saken er at brukeren kontroll js scrips bruker jQuery funksjonalitet (som det skal), men da den prøvde å kjøre, det bryter siden jQuery libs ikke er lastet ennå. Anwyays, er det en vei rundt dette frustrerende rotet?

Jeg bruker dette til å omfatte js i koden min bak. relativeResolvedPath er i utgangspunktet ResolveUrl (url)

    HtmlGenericControl js = new HtmlGenericControl(script);
    js.Attributes.Add(type, text/javascript);
    js.Attributes.Add(src, relativeResolvedPath);
    Page.Header.Controls.Add(js);
Publisert på 29/12/2009 klokken 23:01
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Først vil Page.Controls.Add legge skriptblokken på tilfeldige steder i HTML-dokumentet. Du bør egentlig bare være å legge til skriptfiler i overskriften, eller nederst på siden (søk på nettet vil fortelle deg at den nederst på siden er å foretrekke for bedre UI ytelse).

For å sikre riktig rekkefølgen på Javascript-filer, vil jeg se inn i ASP.Net AJAX Script Loader og Script Manager .

The Script Manager vil fungere dersom du legger til skript i riktig rekkefølge. Ditt problem ville være bedre løses ved hjelp av AJAX Script Loader

Svarte 29/12/2009 kl. 23:18
kilden bruker

stemmer
0

Bruk Page_Init i Master gjøre koden kjøre før barnet siden og UserControl Page_Load hendelser.

Ikke glem å gjøre en og annen "View Source" som en mental helse sjekk. Du må sørge for at ting går inn svaret i den rekkefølgen du forventer.

Klienten script som brukes i UserControls vil ikke kjøre før svaret sendes til brukeren agent, så så lenge de jQuery bibliotekene er inkludert tidligere i svaret, bør du være ok. Dette er ikke egentlig en livssyklus problem med mindre du har serverkoden blandet med klienten kode som du sender.

Jeg har dette i hodet mitt Master

    <link rel="shortcut icon" href="<%#ResolveUrl("~/favicon.ico" ) %>" />
    <script type="text/javascript">
        var applicationRoot = "<%# webController.AppUrl %>";
    </script>
    <asp:Literal ID="litJqueryMinified" runat="server" /><asp:PlaceHolder id="phjQuery" runat="server"><script src="Script/jquery-1.3.2.js" type="text/javascript"></script></asp:PlaceHolder>
    <asp:Literal ID="litJqueryUIMinified" runat="server" /><asp:PlaceHolder id="phjQueryUI" runat="server"><script src="Script/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script></asp:PlaceHolder>
    <script src="<%#ResolveUrl("~/Script/jquery.fancybox-1.2.1.pack.js" ) %>" type="text/javascript"></script>
    <script src="<%#ResolveUrl("~/Script/jquery.maskedinput-1.2.2.min.js" ) %>" type="text/javascript"></script>
    <script src="<%#ResolveUrl("~/Script/jquery.cycle.all.min.js" ) %>" type="text/javascript"></script>

og dette i codebehind:

        // Swap the jQuery inlcude for the minified version
        phjQuery.Visible = false;
        phjQueryUI.Visible = false;
        string jQueryAddress = currentSettings != null && currentSettings["jQueryLocation"] == "local" ? ResolveUrl("Script/jquery-1.3.2.min.js") : "https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js";
        string jQueryUIAddress = currentSettings != null && currentSettings["jQueryLocation"] == "local" ? ResolveUrl("Script/jquery-ui-1.7.2.custom.min.js") : "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js";
        litJqueryMinified.Text = "<script src=\"" + jQueryAddress + "\" type=\"text/javascript\"></script>";
        litJqueryUIMinified.Text = "<script src=\"" + jQueryUIAddress + "\" type=\"text/javascript\"></script>";

Dette tillater meg å ha det minified eller arrangert av google i produksjon, men bruker den fulle versjonen i dev, med IntelliSense.

Ikke glem dette i Page_Load å få ResolveUrl å fungere:

            Page.Header.DataBind();

Håper dette hjelper. :)

Svarte 29/12/2009 kl. 23:27
kilden bruker

stemmer
1

Bruk en Script. Det er veldig lett:

<asp:ScriptManager ID="SM1" runat="server">
  <Scripts>
    <asp:ScriptReference Name="Script.js" />
  </Scripts>
</asp:ScriptManager>

For å gjøre det enda enklere, du bare legge et tomt skript leder kontrollen til Master:

<asp:ScriptManager ID="MasterPageScriptManager" runat="server" />

Og et skript leder proxy på alle dine sider / kontroller som vil ha tilpassede skript lastet:

<asp:ScriptManagerProxy  ID="SM1" runat="server">
  <Scripts>
    <asp:ScriptReference Name="Script.js" />
  </Scripts>
</asp:ScriptManagerProxy>

Edit: hvis dette ikke er det du leter etter, beklager jeg. Det høres ut som du bare prøver å finne ut den riktige plasseringen av skript. En annen ting du kan gjøre hvis dette er tilfelle er å inkludere jQuery i Master og eventuelle fremtidige skript som:

<script type="text/javascript" src='<%= ResolveUrl("~/js/script.js") %>'></script>

Jeg anbefaler ikke å laste javascript fra codebehind mindre du enten dynamisk bygge Javascript-kode, eller du bygger programmet og slippe den til noen for å finjustere brukergrensesnittet og du ikke ønsker at funksjonaliteten tuklet med.

Hvis du laster varsler eller noe lignende, bruke noe sånt som:

string myScript = "$(document).ready(function() { alert('message');});";
Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "alerting", myScript, true); 
Svarte 29/12/2009 kl. 23:34
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more