1

我在 VS 2010 中使用 asp.net。我的项目中有很多网站都使用相同的 javascript 标签。因此,当我添加新页面时,我必须始终包含标签。那么是否有可能总是自动包含javascripttag?当我添加新页面时,一个可能的问题是忘记标签。

使用Javascript标签我的意思是:

<script type="text/javascript" src="jsSource.js"></script>
4

2 回答 2

3

在母版页中包含 javascript 文件并始终使用它是一种可能的解决方案。如果您不使用母版页,则创建一个继承自 Page 类的基类,并在 OnLoad 事件中注册脚本:

ScriptManager.RegisterClientScriptBlock
于 2013-08-01T08:41:09.647 回答
0

(免责声明:我没有测试这段代码......这是一个猜测)。

您可以使用控制适配器来挂钩页面呈现,以便将脚本引用注入您的 javascript 文件。

查看此页面以显示有效解决方案的源代码。此解决方案的优点是它使用 HttpModule 来注册脚本。因此,您只需要修改每个项目的 web.config,而不需要更改所有页面的基类。

根据您的情况,这应该如下所示:

public class ScriptManagerAddModule : IHttpModule
{
    public void IHttpModule.Dispose() { }

    // This is where you can indicate what events in the request processing lifecycle you want to intercept
    public void IHttpModule.Init(System.Web.HttpApplication context)
    {
       context.PreRequestHandlerExecute += new EventHandler(HttpApplication_PreRequestHandlerExecute);
    }

    void HttpApplication_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication httpApplication = sender as HttpApplication;

        if (httpApplication != null)
        {
            Page page = httpApplication.Context.CurrentHandler as Page;
            if (page != null)
            {
                // When standard ASP.NET Pages are being used to handle the request then intercept the
                // PreInit phase of the page's lifecycle since this is where we should dynamically create controls
                page.PreInit += new EventHandler(Page_PreInit);
            }
        }
    }

    void Page_PreInit(object sender, EventArgs e)
    {
        Page page = sender as Page;
        if (page != null)
        {
            // ScriptManagers must be in forms -- look for forms
            foreach (Control control in page.Controls)
            {
                HtmlForm htmlForm = control as HtmlForm;
                if (htmlForm != null)
                {
                    // Look for an existing ScriptManager or a ScriptManagerProxy
                    bool foundScriptManager = false;
                    foreach (Control htmlFormChild in htmlForm.Controls)
                    {
                        if (htmlFormChild is ScriptManager || htmlFormChild is ScriptManagerProxy)
                        {
                            foundScriptManager = true;
                            break;
                        }
                    }

                    // If we didn't find a script manager or a script manager proxy then add one
                    if (!foundScriptManager)
                    {
                        htmlForm.Controls.Add(new ScriptManager());
                    }
                }
            }

            // Addition to the original code
            ScriptManager.GetCurrent().RegisterClientScriptInclude(page, typeof(ScriptManagerAddModule), "myjavascript", "jsSource.js");
            // End of addition to the original code
        }
    }

此代码将确保 ScriptManager 控件的存在,并注册一个自定义 javascript 文件(请参阅我在代码底部添加的内容)。

然后,在所有 web.config 文件中,注册模块:

<httpModules>
    <add name="ScriptManagerAddModule" type="YourLibrary.ScriptManagerAddModule"/>
</httpModules>

请注意,您必须将模块代码放在所有其他项目引用的类库中(或至少在所有 bin 文件夹或 GAC 或 .net 用于查看 dll 的任何位置中包含 dll)。

于 2013-08-07T14:27:44.303 回答