我们主要使用ASP.NET环境。现在我正在构建一个使用“模块”的应用程序,它只是一个UserControl,它的“Javascript”在控件中,并且是该控件的样式表的链接元素。我希望保持模块化,并希望此控件的样式独立于标记/ javascript。
所以我想知道这样做的首选方法是什么?显然,如果我不想要我所追求的“主题”功能,我可以在控件的顶部使用样式标签。现在我有一个链接元素,正如我所说,这是不正确的我不认为。
有没有人有任何首选方法,如果有,为什么以及为什么?
我简单地考虑了ASP.NET主题,但我认为这些控件的想法有点不同。
它基本上是一个购物车系统。我不想深入了解这一切,但我们正在使用一个非常整洁的安全系统,我们不想使用预制购物车。我正在开发一组可以在页面上删除的控件,例如在SiteFinity(我们使用的CMS系统)或我们可能拥有的任何其他项目中。通常我会将这些编译成一个DLL,所以我们得到了我们可以拖放的ACTUAL控件。从工具箱中删除,然后我可以使用内部“通用”样式,并允许任何人可能想要的添加样式,以及提供一些更高级的样式。
这是我第一次这样做,或者真的是我们店里的任何人第一次做到这一点,所以当我走的时候,我有点想办法。我可能离基地很远,但希望我不是。
对,这个想法是有一个“主题”,它实际上只是一个CSS文件和一个jQuery模板。我让它们命名相同,并在usercontrol上有一个Theme属性来设置它。
当这些控件最终确定时,我可能会将javascript重构为代码隐藏中的RegisterScriptBlock,但是现在它们只是在控件本身的脚本标记中。
提示这个问题的是DebugBar for IE,给我警告说div中不允许链接元素。我不太在乎,但在考虑之后,我不知道如何在不这样做的情况下链接到css文件。我在主服务器上非常简单地考虑了一个'空'链接标记,然后在UserControl的Page_Load后面的代码中设置了THAT,但这看起来就像是屁股。
我可以使用@import,但我认为链接标签是首选的,对吗?
答案 0 :(得分:2)
我认为您应该使用Page.RegisterScriptBlock来注册脚本块。最好的情况是你不应该在你的ascx内部脚本块中内嵌它们。这并不总是可行,但从理论上讲,这是最好的方法。
理想情况下,您的样式也应与标记分开。您的控件可以包含类和ID,但您的样式取决于您的应用程序而不是您的控件。理论上,控件可以用在您可能需要不同样式的其他应用程序中。
答案 1 :(得分:2)
听起来你正在推动自己的主题引擎......为什么不使用ASP.NET主题?
如果您决定自己动手,可以使用CssFriendly project中可能感兴趣的一些代码。 (我认为只要我引用代码就可以发布代码。).css文件被标记为嵌入式资源,下面的代码用于根据需要包含它们。
string filePath = page.ClientScript.GetWebResourceUrl(type, css);
// if filePath is not empty, embedded CSS exists -- register it
if (!String.IsNullOrEmpty(filePath))
{
if (!Helpers.HeadContainsLinkHref(page, filePath))
{
HtmlLink link = new HtmlLink();
link.Href = page.ResolveUrl(filePath);
link.Attributes["type"] = "text/css";
link.Attributes["rel"] = "stylesheet";
page.Header.Controls.Add(link);
}
}
答案 2 :(得分:1)
这取决于你的应用程序有多大,以及它是否依赖于其他地方的主题,恕我直言。
如果您使用的是.skin文件,或者如果大部分应用也插入到主题中,您也可以使用主题。
但如果它只是你需要的几种样式,你最好手动设置样式表,保持你的css文件外部(内联样式是PITA并且击败了css的核心目的之一)。
在任何一种情况下,都不要忘记在控件上设置CssClass属性。
答案 3 :(得分:1)
为了正确,我将有一个import.css文件 - 构造类的命名以跟随您的控件,并在文档的标题中导入样式。
如果您有一个名为“30DayPricingCalc”的模块,那么您可以命名类/ ID:
<强> 30DayPricingCalc.css 强>
.30daypricingcalc_main_content
{
...
}
另外,如果你还没有,我会设置一个通用可重用样式列表来节省你的空间。因为元素将允许每个对象有多个类。
此外,链接标签现在比以前更重要了。我们已经过去支持IE5代浏览器了,IE6支持@import标签。
干杯!