Skip to main content

Dynamically Adding JavaScript files in the Head of a .Net Master Page

Sometimes javaScript files need to be sourced in the head of an HTML document; however the >net framework does not appear to update tIf you add a link element into the head of the .Net master page, e.g to use a style sheet, then the .Net framework takes care of sorting out the relative URI resource, so that the correct path for the style sheet is always used.

e.g. linking to a style sheet in the head of a master page

<link href="StyleSheetFile.css" rel="stylesheet" type="text/css" />

would be automatically converted, if you went in to a sub directory, to

<link href="../StyleSheetFile.css" rel="stylesheet" type="text/css" />

However a source used to load a JavaScript file does not behave in the same way and the path remains as defined in the master page.

e.g. linking to a javascript file in the head of a master page, no matter how deep in to the directory structure you go, will stay as

<script src="JavaScriptFile.js" type="text/javascript" />

Using the ClientScriptManager class, along with ResolveClientUrl and RegisterClientScriptInclude, results in a correctly referenced JavaScript file no matter where the user is in the site, but adds the source code just after the opening Form tag within the page. Not what is always needed!!

To get round this and provide a way for the JavaScript to remain referenced correctly from the master page, such as custom controls, but a quick and simple solution is to use a Literal control in the head of the masterpage, and from the code behind add the javascript source links.

Masterpage.master file


<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder id="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
        <asp:Literal ID="txtSourceJS" runat="server" />
    </div>
    </form>
</body>
</html>

MasterPage.master.cs (master page code behind):


public partial class MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.txtSourceJS.Text = this.txtSourceJS.Text + "<script src=\"" + ResolveClientUrl("~/JavaScriptFile01.js") + "\" type=\"text/javascript\" />";
        this.txtSourceJS.Text = this.txtSourceJS.Text + "<script src=\"" + ResolveClientUrl("~/JavaScriptFile02.js") + "\" type=\"text/javascript\" />";
    }
}

Comments

Popular posts from this blog

EF CodeFirst Database.SetInitializser Requires Connection to 'master' Database Error

One of the features of EF CodeFirst is the ability to automatically drop and recreate a database if the model changes or if the database does not exist, which is pretty useful when just doing development work. In a web app this is done in the Global.asax file within "protected void Application_Start()" as per this post from Scott Guthrie -  http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx . An example would be: protected void Application_Start() { Database.SetInitializer<yourdbcontex>(new DropCreateDatabaseIfModelChanges<yourdbcontext>()); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } However when using the Database.SetInitializer and trying to rebuild the database, the following exception may be encountered, especially if using SQL Server Express: "This operation requires a connection to the 'master'...

Enable .NET 8 Preview in Visual Studio

Download the SDK using Download .NET 8.0 (Linux, macOS, and Windows) (microsoft.com)  and install it. To enable projects to target the .NET 8 preview framework, the preview option in Visual Studio needs to be enabled, otherwise the option to target .NET 8 will not be available as shown below when setting up a new project (or trying to upgrade an existing one). To allow .NET 8 Preview to be used as a target framework for projects, the preview option needs to be enabled in Visual Studio. Open Visual Studio and select "Continue without code" In Visual Studio, select Tools then Options In Options, under Environment, select Preview Features and enable Use previews of the .NET SDK.

VWD Express 2010 Unit Tests with xUnit and MVC Templates

Microsoft's Visual Web Developer 2010 Express (VWD 2010 Express), by default does not come with a built in unit testing solution. However the ability is there to use unit tests with the Express version as can be seen when creating a new MVC project. Tech spec stuff: Microsoft Windows 7 Microsoft Visual Studio 2010 Express, Version 10.0.40219.1 SP1 Microsfot .NET Framework Version 4.0.30319 SP1 Getting started with xUnit xUnit is a "developer testing framework, built to support Test Driven Development (TDD)". There are other unit testing frameworks available (MSTest, nUnit, etc.). There are pro's to each and some better than others but xUnit is pretty straightforward to get up and running with the VWD 2010 Express version. Download and Install xUnit The xUnit project can be found at:  http://xunit.codeplex.com/ . Downloads are available from  http://xunit.codeplex.com/releases/view/62840 . Download the recommended version (currently 1.8 at time of writi...