我有一个部分视图(.ascx),它应该包含自己的CSS文件,因为它在多个其他视图中使用。我如何在服务器端注入样式表,即不使用JavaScript的方法?
// standard method - renders as defined in as(cp)x file
public static string Css(this HtmlHelper html, string path)
{
return html.Css(path, false);
}
// override - to allow javascript to put css in head
public static string Css(this HtmlHelper html, string path, bool renderAsAjax)
{
var filePath = VirtualPathUtility.ToAbsolute(path);
HttpContextBase context = html.ViewContext.HttpContext;
// don't add the file if it's already there
if (context.Items.Contains(filePath))
return "";
// otherwise, add it to the context and put on page
// this of course only works for items going in via the current
// request and by this method
context.Items.Add(filePath, filePath);
// js and css function strings
const string jsHead = "<script type='text/javascript'>";
const string jsFoot = "</script>";
const string jsFunctionStt = "$(function(){";
const string jsFunctionEnd = "});";
string linkText = string.Format("<link rel=\"stylesheet\" type=\"text/css\" href=\"{0}\"></link>", filePath);
string jsBody = string.Format("$('head').prepend('{0}');", linkText);
var sb = new StringBuilder();
if (renderAsAjax)
{
// join it all up now
sb.Append(jsHead);
sb.AppendFormat("\r\n\t");
sb.Append(jsFunctionStt);
sb.AppendFormat("\r\n\t\t");
sb.Append(jsBody);
sb.AppendFormat("\r\n\t");
sb.Append(jsFunctionEnd);
sb.AppendFormat("\r\n");
sb.Append(jsFoot);
}
else
{
sb.Append(linkText);
}
return sb.ToString();
}
用法:
<%=Html.Css("~/Content/yourstyle.Css")%>
或者:
<%=Html.Css("~/Content/yourstyle.Css", true)%> // or false if you want!!
如果一切都失败了,这种方法就值得尝试。还有可能根据上述逻辑来击中一个ActionFilter,并将CSS添加到响应头中等等,而不是输出JS字符串。
我不是ASP.NET或MVC专家,但我目前正在使用它进行项目开发。在您的母版页头部分是否可以包含类似以下内容?
<asp:ContentPlaceHolder ID="HeadContent" runat="server"></asp:ContentPlaceHolder>
然后如何将您的CSS放入内容占位符中呢?
<asp:Content ID="styleSheetHolder" ContentPlaceHolderID="HeadContent" runat="server">
<link rel='stylesheet' href='yourstyle.css' type='text/css' />
</asp:Content>
看起来你需要从调用页面做这件事,这将引入重复的代码。我不确定如何避免这个问题。也许可以使用 HTML 助手来完成它。
你不能把样式表放在主视图页面中吗?除非它非常大,否则即使在未使用时,它也不应该导致页面加载明显变慢,尤其是在压缩后。
此外,如果通过ajax检索部分视图,则将多次重新下载css文件(取决于浏览器的缓存)。
<link rel="stylesheet" href="yourstyle.css" type="text/css" />
head
标签内的说明。 - ajay_whiz