我正在使用ASP.Net并进行身份验证。当用户被定向到登录页面时,我收到一个JavaScript错误:
消息:语法错误行:3个字符:1 代码:0 URI: http://localhost:49791/login.aspx?ReturnUrl=%2fWebImageButton.js
这是因为我在单独的Web Control Project控件中使用自定义图像按钮,该控件将ScriptReference添加到页面中:
public class WebImageButton : LinkButton, IScriptControl, IButtonControl
{
protected override void OnPreRender(EventArgs e)
{
// Link the script up with the script manager
ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
if (scriptManager != null)
{
scriptManager.RegisterScriptControl(this);
scriptManager.Scripts.Add(new ScriptReference("<snip>.WebImageButton.js", "<snip>"));
}
base.OnPreRender(e);
}
}
如果我将以下规则添加到我的Web.Config中,则该文件已成功导入:
<location path="WebImageButton.js">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
这不是很好,因为我有许多自定义控件执行相同的操作,我并不特别想要单独验证每个js文件。
我是否无法声明应该允许所有导入的脚本引用?我尝试在允许的情况下授权WebResource.axd文件,但页面本身(在呈现时)物理上引用了WebImageButton.js文件。
理想情况如下:
<location path="My.WebControlLibraryProject.Controls">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
有没有办法在不列出每个文件的情况下实现这一目标?
<小时/> 编辑:为了清楚起见,这些脚本文件位于另一个项目中,而不在我的实际Web项目中。我知道如何声明目录路径的位置路径以在一个wack中包含大量文件,但我无法弄清楚如何验证来自嵌入式资源的自动脚本引用。
答案 0 :(得分:0)
这只是猜测 - 您是否尝试在位置路径中插入通配符?也许类似于&lt; location path =“*。js”&gt;?
答案 1 :(得分:0)
您可以指定一个通用位置并将所有脚本放在那里,以便所有不需要授权的脚本都会通过。您只需要将路径更改为您想要的任何文件夹,并将脚本放在那里。
这不仅适用于脚本,也适用于其他资源,例如图像,样式表等。
答案 2 :(得分:0)
WebImageButton.js
是嵌入式资源吗?正如我所见,你实施了IScriptControl
。因此,您必须返回IScriptControl.GetScriptReferences
上的所有脚本引用。我认为嵌入式资源永远不会被授权。我在不同的情况下使用一些自定义控件,没有任何问题。我想知道脚本管理器直接引用WebImageButton.js
,而不是.axd文件的形式。所以,我认为问题是由你的资源文件引起的。
public class WebImageButton : LinkButton, IScriptControl, IButtonControl
{
protected ScriptManager ScriptManager
{
get
{
ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
if (scriptManager == null)
{
throw new System.Web.HttpException("<snip>");
}
return scriptManager;
}
}
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
this.ScriptManager.RegisterScriptControl<WebImageButton>(this);
}
#region IScriptControl Members
public System.Collections.Generic.IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
yield break;
}
public System.Collections.Generic.IEnumerable<ScriptReference> GetScriptReferences()
{
yield return new ScriptReference("<snip>.WebImageButton.js", "Assembly Name");
}
#endregion
}