我在 VS 2010 中使用 asp.net。我的项目中有很多网站都使用相同的 javascript 标签。因此,当我添加新页面时,我必须始终包含标签。那么是否有可能总是自动包含javascripttag?当我添加新页面时,一个可能的问题是忘记标签。
使用Javascript标签我的意思是:
<script type="text/javascript" src="jsSource.js"></script>
我在 VS 2010 中使用 asp.net。我的项目中有很多网站都使用相同的 javascript 标签。因此,当我添加新页面时,我必须始终包含标签。那么是否有可能总是自动包含javascripttag?当我添加新页面时,一个可能的问题是忘记标签。
使用Javascript标签我的意思是:
<script type="text/javascript" src="jsSource.js"></script>
在母版页中包含 javascript 文件并始终使用它是一种可能的解决方案。如果您不使用母版页,则创建一个继承自 Page 类的基类,并在 OnLoad 事件中注册脚本:
ScriptManager.RegisterClientScriptBlock
(免责声明:我没有测试这段代码......这是一个猜测)。
您可以使用控制适配器来挂钩页面呈现,以便将脚本引用注入您的 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)。