我刚在代码项目上找到了文章,这让我很感兴趣.所以我在这里实现了这个:
我有两个项目:
在MyComponent.Web我有
AssemblyInfo.cs
[assembly: WebResource(WebResourceHelper.JQueryPath, "text/javascript")]WebResourceHelper.cs
public static class WebResourceHelper
{
internal const string JQueryPath = "MyComponent.Web.WebResources.jQuery.jquery-1.5.1.min.js";
public static void RegisterJQuery(this Page page)
{
page.RegisterWebResource(JQueryPath);
}
public static void RegisterWebResource(this Page page, string path)
{
Contract.Requires(page != null);
Contract.Requires(!string.IsNullOrEmpty(path));
var pageType = page.GetType();
var webResourcePath = page.ClientScript.GetWebResourceUrl(pageType, path);
page.ClientScript.RegisterClientScriptResource(pageType, webResourcePath);
}
}TextBox.cs
// namespace: MyComponent.Web.UI.WebControls
public sealed class TextBox : System.Web.UI.WebControls.TextBox
{
#region life cycle
protected override void OnInit(System.EventArgs e)
{
base.OnInit(e);
this.Page.RegisterJQuery();
}
#endregion
}另外,我的脚本文件将构建操作设置为Embedded Resource。
在MyComponent.Web.Demo我有
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<myComponent:TextBox runat="server" ID="textBox" />
</div>
</form>
</body>
</html>web.config
<system.web>
<pages>
<controls>
<add tagPrefix="myComponent" namespace="MyComponent.Web.UI.WebControls" assembly="MyComponent.Web" />
</controls>
</pages>
</system.web>但是WebResource.axd给了我一个404,而Reflector向我展示了,我正确地嵌入了资源--那么我在这里做错了什么呢?
编辑你可以下载这里有个演示
发布于 2011-03-02 08:50:19
最恶心的是这里的这个:
this.Page.RegisterJQuery();与
var webResourcePath = page.ClientScript.GetWebResourceUrl(pageType, path);page.ClientScript.GetWebResourceUrl()使用pageType的程序集来搜索资源。因为我已经将资源丢弃在另一个程序集中,所以它找不到它。
因此,解决办法是:
TextBox.cs
// namespace: MyComponent.Web.UI.WebControls
public sealed class TextBox : System.Web.UI.WebControls.TextBox
{
#region life cycle
protected override void OnInit(System.EventArgs e)
{
base.OnInit(e);
this.RegisterJQuery();
}
#endregion
}WebResourceHelper.cs
public static class WebResourceHelper
{
internal const string JQueryPath = "MyComponent.Web.WebResources.jQuery.jquery-1.5.1.min.js";
internal const string JQueryKey = "jQuery";
private static readonly Type TypeOfWebResourceHelper = typeof (WebResourceHelper);
public static void RegisterJQuery<TControl>(this TControl control)
where TControl : Control
{
control.RegisterWebResource(JQueryKey, JQueryPath);
}
internal static void RegisterWebResource<TControl>(this TControl control, string key, string path)
where TControl : Control
{
Contract.Requires(control != null);
Contract.Requires(!string.IsNullOrEmpty(key));
Contract.Requires(!string.IsNullOrEmpty(path));
var page = control.Page;
if (page.ClientScript.IsClientScriptIncludeRegistered(key))
{
return;
}
var webResourcePath = page.ClientScript.GetWebResourceUrl(TypeOfWebResourceHelper, path);
page.ClientScript.RegisterClientScriptInclude(key, webResourcePath);
}
}https://stackoverflow.com/questions/5164863
复制相似问题