用于声明客户端包含的ASP.NET指令约定

时间:2011-03-10 03:45:25

标签: javascript asp.net asp.net-mvc-2 server-side-includes page-directives

我正在将.aspx和.ascx文件加载为StreamReader

我希望每个文件在<%@ ClientDependency path="~/Scripts/jquery-1.4.1.min.js" %>之类的声明中注册它的javascript和样式表依赖项。

是否存在执行此类操作的惯例?我不需要实现,但如果已经有办法,我不想创建新的语法。

此外,ASP.NET中自定义<%@块的准则是什么?

另外,如果您能想出更恰当的描述,请重新提出这个问题。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

<强>基本上...

以下是我目前在MVC项目中所做的事情:

  • 使用Telerik的Web Asset Manager在我知道将在每个页面上使用的母版页中注册我的所有常用脚本和CSS (有一个开源下载,如果像我一样,你没有'知道)

  • 我将所有JS功能(超出几行)封装到存储在适当的外部JS文件中的函数中。

  • 我将所有扩展的UI功能封装到HTML Helpers中。然后,他们使用StyleSheetRegistrar和ScriptsRegistrars动态加载该特定帮助程序所需的任何额外CSS或JS。并依赖Telerik经理不要多次加载它们。

  • 如果我使用内联样式,我会通过htmlAttributes对象在Helper方法中手动指定样式标记,但很少见。

  • 为了调用HTML元素所需的javascript功能,我使用 ScriptRegistrar()。OnDocumentReady()的字符串重载来指定调用该元素的javascript函数。

  • 我还在 HtmlHelpers 类中为 ScriptRegistrarBuilder 定义了一个简单的扩展方法,它允许我提供参数的参数列表以传递给我的javascript方法调用,在调用 OnDocumentReady()时,没有一串字符串连接。

    public static void OnDocumentReady(this ScriptRegistrarBuilder builder, string format, params string[] args)
    {
        builder.OnDocumentReady(String.Format(format, args));
    }
    
  • 当然,我在Master页面的底部渲染了所有JS。

你没有在这里避免使用内联JS,但如果你做得对,它会保持相当薄。老实说,我真的不能想到另一种不会开始变得复杂的方式。

最后,我认为你会得到一些非常灵活的东西,同时也可以让你在任何给定页面上加载你所做和不需要的东西。

我用这种方法发现的唯一警告就是CSS。为了能够在帮助者需要时将CSS文件动态加载到页面中,我必须在Master页面的底部渲染所有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>

答案 2 :(得分:0)

对于使用指令注册客户端包含,没有现有的约定。我的解决方案是创建一个自定义服务器控件,并使用现有的TemplateParser功能来获取包含数据(最终将文件作为流加载并自行解析)。