我将 .aspx 和 .ascx 文件加载为StreamReader
.
我希望每个文件在像<%@ ClientDependency path="~/Scripts/jquery-1.4.1.min.js" %>
.
是否有现有的惯例来做这样的事情?我不需要实现,但如果已经有办法,我不想创建新语法。
<%@
此外, ASP.NET中自定义块的准则是什么?
另外,如果您能想到更合适的描述,请重新标记此问题。
我将 .aspx 和 .ascx 文件加载为StreamReader
.
我希望每个文件在像<%@ ClientDependency path="~/Scripts/jquery-1.4.1.min.js" %>
.
是否有现有的惯例来做这样的事情?我不需要实现,但如果已经有办法,我不想创建新语法。
<%@
此外, ASP.NET中自定义块的准则是什么?
另外,如果您能想到更合适的描述,请重新标记此问题。
基本上...
这是我在当前 MVC 项目中所做的事情:
使用 Telerik 的 Web Asset Manager 在 Master Page 中注册我所有的常用脚本和 CSS,我知道这些脚本和 CSS 将在每个页面上使用(有一个开源下载,如果像我一样,你不知道)。
我将所有 JS 功能(除了几行之外)封装到存储在适当的外部 JS 文件中的函数中。
我将所有扩展的 UI 功能封装到 HTML Helpers 中。然后,他们使用 StyleSheetRegistrar 和 ScriptsRegistrars 动态加载该特定帮助程序所需的任何额外 CSS 或 JS。并且依靠 Telerik 管理器不要多次加载它们。
如果我曾经使用过内联样式,我会通过 htmlAttributes 对象在 Helper 方法中手动指定样式标记,但这种情况很少见。
为了调用 HTML 元素所需的 javascript 功能,我使用ScriptRegistrar().OnDocumentReady()的字符串重载来指定调用该元素的 javascript 函数。
我还在我的HtmlHelpers类中为ScriptRegistrarBuilder定义了一个简单的扩展方法,它允许我在调用OnDocumentReady()时提供参数的参数列表以传递给我的 javascript 方法调用,而无需一堆字符串连接。
public static void OnDocumentReady(this ScriptRegistrarBuilder builder, string format, params string[] args)
{
builder.OnDocumentReady(String.Format(format, args));
}
当然,我将所有的 JS 渲染在母版页的底部。
你不会在这里避免所有内联 JS 的使用,但如果你做得对的话,它会保持它很薄。老实说,我真的想不出另一种不会开始变得过于复杂的方法。
最后,我认为你会得到一些非常灵活的东西,同时让你可以相当具体地加载你在任何给定页面上需要和不需要的内容。
我发现这种方法的唯一警告是在 CSS 方面。为了能够在帮助程序需要 CSS 文件时将它们动态加载到页面中,我必须在母版页底部呈现所有 CSS 包括,超过任何可能的添加新文件的调用。
不幸的是,还没有找到解决方法。
一个小例子
也许对您来说是不必要的详细信息……但是这样搜索的人也有望找到有用的解决方案!:)
在母版页中:
<%
Html.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles
.Add("~/Content/Site.css")
.Add("~/Content/core.css")
);
Html.Telerik().ScriptsRegistrar().DefaultGroup(scripts => scripts
.Add("~/Scripts/common.js")
.Combine(true)
.Compress(true)
.CacheDurationInDays(30)
);
%>
然后在正文结束标签上方的某个地方:
<%:
Html.Telerik().ScriptsRegistrar().Render();
Html.Telerik().StyleSheetsRegistrar().Render();
%>
在您的 HTML 帮助程序中:
public static MvcHtmlString AutoCompleteComboListFor<TModel, TProperty>(this HtmlHelper<TModel> Helper, Expression<Func<TModel, TProperty>> expression,
SelectList List, string DataSource)
{
MvcHtmlString dropDown = SelectExtensions.DropDownListFor<TModel, TProperty>(Helper, expression, List);
string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
string id = Helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName);
//Do whatever you want
helper.Telerik().ScriptRegistrar().DefaultGroup(scripts => scripts
.Add("~/Scripts/extended.js")
);
helper.Telerik().StyleSheetRegistrar().DefaultGroup(styles => styles
.Add("~/Content/extended.css")
);
helper.Telerik().ScriptRegistrar().OnDocumentReady(@"MyExtendedFunction('{0}');", id);
return dropDown;
}
简单地调用该帮助器(或任何其他)将在包含所有 JS 代码、文件和 CSS 文件的页面末尾的一个整洁的块中结束。
<link type="text/css" href="/Content/Site.css" rel="stylesheet"/>
<script type="text/javascript" src="/asset.axd?id=kAAAAB-LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee--997o7nU4n99__P1xmZAFs9s5K2smeIYCqyB8_fnwfPyJ-8Uezjx597xd_tPro0Uevp3WxapuPRh-d82dL-uynf9E6r6-3d8f79N9P47vqo0c7v2Qk3-bv2nw5y2f2m91f8v1f8v3RR9OWvmzp27s_nV1mDcOlBpf06d7O7s743nj33u4BfTKl3u99ep9--ehRW6_zX_L_BAAA___9S_3qkAAAAA%3d%3d"></script>
<script type="text/javascript">
//<![CDATA[
jQuery(document).ready(function(){
myFunction('Foo');});
//]]>
</script>
没有使用指令注册客户端包含的现有约定。我的解决方案是创建一个自定义服务器控件,并使用现有TemplateParser
功能来获取包含数据(这最终比将文件作为流加载并自己解析更可取)。