views:

1005

answers:

2

I have a master page that is in /Views/Shared. The master page references a stylesheet in the /Content folder.

Everything works fine if I reference the stylesheet using "../../Content/style.css". However, my web application is not in the root folder in our production environment, so the relative path doesn't work.

I have tried "<%=ResolveUrl("~/content/style.css") %>" Which does work in the production scenario, but then the designer in VS complains about my classes being wrong (and I cannot preview the page with css in the design tab)

Is there a solution that makes this work in both situation. I accomplished this in WebForms by writing server-side code that reset the link tag. I could do that here but would like to avoid it.

Thanks to anyone that can help.

+6  A: 

Try this technique - include your stylesheet both ways. Include one with a fixed path reference that Visual Studio will use for design-time support, but enclose it in server-side comments so it's not actually included during run-time. The second reference is the "real" reference used at run-time, and with Url.Content() it'll work whether your app is a sub directory or not.

<% /* %> 
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
<% */ %>

<link href="<%=Url.Content("~/Content/Site.css") %>" rel="stylesheet" 
      type="text/css" />
Kurt Schindler
+1 Interesting technique! I would use T4MVC in order to do this as well.
Dan Atkinson
I like this idea. It's a work-around, but it meets both of the requirements. It would be nice if the ASPX designer would parse server side code when previewing the page.
MediaSlayer
You can also make the static link runat="server" visible="false" which is somewhat simpler.
Hightechrider
+4  A: 

It is best practice to Extend the URL Helper. This allows you to easily call it from your view, and if your structure or files change, you don't need to do a massive find/replace.

public static string Image(this UrlHelper helper, string fileName)  
{  
    return helper.Content("~/Content/Images/" + fileName));  
}  

public static string Stylesheet(this UrlHelper helper, string fileName)  
{  
    return helper.Content("~/Content/Stylesheets/" + fileName);  
}  

public static string Script(this UrlHelper helper, string fileName)  
{  
    return helper.Content("~/Content/Scripts/" + fileName);  
}

   <link href="<%= UrlHelper.Stylesheet("Main.css")%>" rel="stylesheet" 
         type="text/css" />  
Martin
Why is this a best practice?
Robert Harvey
so that you can easily refer it in your view, and if any of those change, you don't have to do a find/replace.
Martin
I understand your point, but it doesn't solve the problem of the VS designer not resolving the CSS location.
MediaSlayer
I wouldn't rely on the VS designer (the designer rarely renders like a real browser). You should be viewing the page in an actual browser.
Martin
I agree. But it comes in handy for a reference check.
MediaSlayer