- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了一个实现 ScriptControl 的简单控件。这是 JQuery 框架的持有者:
/// <summary>
/// Generic control with client behavior handled via jQuery
/// </summary>
public abstract partial class JQControl : ScriptControl, INamingContainer
{
/// <summary>
/// Client method to be called after jQuery initialization
/// </summary>
[PersistenceMode(PersistenceMode.InnerProperty)]
public JQRaw AfterInit
{
get;
set;
}
/// <summary>
/// Client method to be called before jQuery initialization
/// </summary>
[PersistenceMode(PersistenceMode.InnerProperty)]
public JQRaw PreInit
{
get;
set;
}
/// <summary>
/// Any data to initialize the control with (name-value pairs)
/// </summary>
public IDictionary<string, object> InitData
{
get; set;
}
/// <summary>
/// Authorization templates to be registered and used by privilege manager
/// </summary>
public IDictionary<string, AuthorizationTemplate> AuthorizationTemplates
{
get; set;
}
/// <summary>
/// If ThemePath is specified, this css file will be looked for and loaded from the theme folder
/// </summary>
protected string ThemeCssName
{
get; set;
}
private string _themePath;
/// <summary>
/// Specifies path to look for custom css and images to enable theming.
/// </summary>
public string ThemePath
{
get
{
return _themePath == null ? DefaultThemeHelper.ThemeName : ResolveClientUrl(_themePath);
}
set
{
_themePath = value;
}
}
/// <summary>
/// Collection of streamed javascript files
/// </summary>
private readonly List<ScriptReference> scriptRefs = new List<ScriptReference>();
/// <summary>
/// Collection of streamed stylesheet files
/// </summary>
private readonly List<string> cssRefs = new List<string>();
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
FillScriptReferences();
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
}
protected bool useDynamicCss = true;
private bool dynamicCssEnabled;
protected void EnableDynamicCss()
{
if(!dynamicCssEnabled)
{
//enable dynamic css loading
addScriptReference(typeof(JQControl), "LWM.Implementation.Controls.DynamicStylesheet.css.js");
dynamicCssEnabled = true;
}
}
protected virtual void FillScriptReferences()
{
Type t = typeof(JQControl);
addScriptReference(t, "LWM.Implementation.Controls.JScripts.Jquery.js");
addScriptReference(t, "LWM.Implementation.Controls.JScripts.ExtendJQuery.js");
addScriptReference(t, "LWM.Implementation.Controls.JScripts.ExtendAJAXDotNet.js");
addScriptReference(t, "LWM.Implementation.Controls.JQ.ChainRequests.js");
addScriptReference(t, "LWM.Implementation.Controls.JScripts.jquery.jcache.js");
addScriptReference(t, "LWM.Implementation.Controls.JScripts.jquery.cookie.js");
addScriptReference(t, "LWM.Implementation.Controls.JScripts.jquery.offset.js");
//if ((_themePath != null && ThemeCssName != null))
{
EnableDynamicCss();
}
}
//added to render automatically assigned id, otherwise escaped
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
const string extCss = "jqcontrol";
this.CssClass = this.CssClass != null ? this.CssClass + " " + extCss : extCss;
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
//writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClass);
}
/// <summary>
/// Ataches an embedded script refernnce using its full name
/// </summary>
/// <param name="name">Name of the reference</param>
/// <param name="useBaseClassAssembly">True if using base class assembly</param>
protected void AttachScriptRefernceByName(string name, bool useBaseClassAssembly)
{
//current type
Type type = this.GetType();
if (useBaseClassAssembly)
{
//base type
type = type.BaseType;
}
addScriptReference(type, name);
}
private void _addCssReference(Type type, string name)
{
string assembly = type.Assembly.FullName;
Type t = null;
if (BoostHelper.AdjustResourceParts(this, type.Assembly, ref assembly, ref name, ref t))
{
// LoggerHelper.LogInfo(String.Format("CSS init with- Client Script:{0}, Type:{1}, Name:{2} ", this.Page.ClientScript.ToString(),t.ToString(),name),"LWMSiteResourceBooster");
var sr = new DynamicStylesheetScriptReference(this.Page.ClientScript, t, new[] { name }); //(name, assembly);
if (!scriptRefs.Contains(sr))
{
scriptRefs.Add(sr);
}
}
else
{
string url = name; // GetEmbeddedURL(type, name);
if (!cssRefs.Contains(url))
{
cssRefs.Add(url);
}
}
}
//protected void addCssReference(string name, Type type)
//{
// _addCssReference(type, name);
// if (cssRefs.Count > 0)
// {
// scriptRefs.Add(new DynamicStylesheetScriptReference(this.Page.ClientScript, type, cssRefs.ToArray()));
// cssRefs.Clear();
// }
//}
protected void addCssReference(Type type, params string[] names)
{
if (names == null) return;
foreach (string name in names)
{
_addCssReference(type, name);
}
if(cssRefs.Count > 0)
{
scriptRefs.Add(new DynamicStylesheetScriptReference(this.Page.ClientScript, type, cssRefs.ToArray()));
cssRefs.Clear();
}
}
protected void removeCssReference(Type type, string name)
{
//TODO
//if (cssRefs.Contains(url))
//{
// cssRefs.Remove(url);
//}
}
protected void addScriptReference(Type type, string name)
{
//full name of the current assembly
string assembly = type.Assembly.FullName;
Type t = null;
BoostHelper.AdjustResourceParts(this, type.Assembly, ref assembly, ref name, ref t);
var sr = new HumanReadableScriptReference(name, assembly);
if (!scriptRefs.Contains(sr))
{
scriptRefs.Add(sr);
}
}
protected void removeScriptReference(Type type, string name)
{
//full name of the current assembly
string assembly = type.Assembly.FullName;
Type t = null;
BoostHelper.AdjustResourceParts(this, type.Assembly, ref assembly, ref name, ref t);
var sr = new HumanReadableScriptReference(name, assembly);
if (scriptRefs.Contains(sr))
{
scriptRefs.Remove(sr);
}
}
private string _jqBreadCrumb;
/// <summary>
/// Unique jQuery pattern that identifies this control
/// </summary>
protected string JQBreadCrumb
{
get
{
if (_jqBreadCrumb == null)
{
//StringBuilder sb = new StringBuilder();
//Control c = this;
Control c = this.NamingContainer;
//int step = 1;
while (c != null && c.ClientID != "__Page")
{
if (c is JQControl) // || step > 1)
{
_jqBreadCrumb = c.ClientID;
break;
//sb.Insert(0, " ");
//sb.Insert(0, "#" + c.ClientID);
}
c = c.NamingContainer;
//step++;
}
//_jqBreadCrumb = sb.ToString();
}
return _jqBreadCrumb;
}
}
//regular expression to look for tokens
private static readonly Regex tokenRegex = new Regex(
@"##(?<tokenName>[\w\:]+)"
);
//actually replaces tokens
private string tokenReplacer(Match m, bool useContext)
{
//token found
string tokenName = m.Groups["tokenName"].Value;
string ctlName = null;
//check if we have a resource token
if (ResourceHelper.CheckStringForToken(tokenName))
{
return "\"" + ResourceHelper.GetStringByToken(tokenName, ResourceType.Portal) + "\"";
}
switch (tokenName)
{
case "this":
//special case: seek for the current control
if (useContext) return "$(__$)";
ctlName = "#" + this.ClientID; // JQBreadCrumb;
break;
case "parent":
//special case: seek for the direct parent control
ctlName = "#" + JQBreadCrumb;
// this.NamingContainer.ClientID; //NOTE: use parent breadcrumb here
break;
default:
//seek for the child control with the given name
if (!useContext)
{
Control ctl = getChildByName(tokenName);
if (ctl != null) ctlName = "#" + ctl.ClientID;
}
//else ctlName = "[id^='" + this.ClientID + "_']" + "[id$='_" + tokenName + "']:first";
break;
}
if(ctlName != null) return "$(\"" + ctlName + "\")";
if (!useContext) return "$(this)._cc('" + tokenName + "', '" + this.ClientID + "')";
return "$(__$)._cc('" + tokenName + "')";
}
private string tokenReplacerWithContext(Match m)
{
return tokenReplacer(m, true);
}
private string tokenReplacerWithoutContext(Match m)
{
return tokenReplacer(m, false);
}
protected virtual Control getChildByName(string name)
{
return this.Controls.Cast<Control>().SingleOrDefault(c => c.ID == name);
}
//regular expression to insert context holder
private static readonly Regex contextRegex = new Regex(
@"^(\s*function\(\s*\)\s*{)", RegexOptions.Multiline
);
private static int replacedNum;
private static string contextReplacer(Match m)
{
replacedNum++;
return "function() { var __$ = this; \r\n";
}
/// <summary>
/// Substitue occurences of tokens of type ##[token] into corresponding jQuery calls
/// </summary>
/// <param name="callbackMethod">Callback method definition that contains tokens</param>
/// <param name="useContext">True if local context is to be used on the client</param>
protected void PrepareCallbackMethod(JQRaw callbackMethod, bool useContext)
{
if(useContext)
{
replacedNum = 0;
callbackMethod.JQRawContent = contextRegex.Replace(callbackMethod.JQRawContent, contextReplacer);
if(replacedNum == 0) useContext = false;
}
if (callbackMethod != null)
{
MatchEvaluator me;
if(useContext) me = tokenReplacerWithContext;
else me = tokenReplacerWithoutContext;
//find tokens in callback body and replace them
callbackMethod.JQRawContent = tokenRegex.Replace(callbackMethod.JQRawContent, me);
}
}
protected void PrepareCallbackMethod(JQRaw callbackMethod)
{
PrepareCallbackMethod(callbackMethod, false);
}
protected virtual void PrepareCallbackMethods(object @params)
{
foreach (PropertyInfo pi in @params.GetType().GetProperties().Where(
p => p.PropertyType.Equals(typeof(JQRaw))
))
{
if (pi.GetCustomAttributes(typeof(CallbackMethodAttribute), false).Length > 0)
{
//property has the attribute: prepare
JQRaw pty = (JQRaw)pi.GetValue(@params, null);
if (pty != null && pty.JQRawContent != null)
{
PrepareCallbackMethod(pty);
}
}
}
}
/// <summary>
/// Returns the script files for the control
/// </summary>
/// <returns>Collection that contains ECMAScript (JavaScript) files that have been registered as embedded resources</returns>
protected override IEnumerable<ScriptReference> GetScriptReferences()
{
return scriptRefs;
}
private const string selfAlias = "__$";
protected virtual string GetDescriptorSelector()
{
//return this.ClientID;
return selfAlias;
}
protected virtual IEnumerable<ScriptDescriptor> _getScriptDescriptors()
{
yield break;
}
//private const string afterInitTemplate = "function() {{ var _method = {0}; _method(); $('#{1}').trigger('_loadComplete'); }}";
protected sealed override IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
var result = new List<ScriptDescriptor>();
//yield return new JQSelfDescriptor(this.ClientID, selfAlias);
result.Add(new JQSelfDescriptor(this.ClientID, selfAlias));
if (PreInit != null)
{
//to be executed before initialization
PrepareCallbackMethod(PreInit, true);
//yield return new JQDescriptor(GetDescriptorSelector(), "each", true, PreInit);
result.Add(new JQDescriptor(GetDescriptorSelector(), "each", true, PreInit));
}
if(InitData != null)
{
foreach (string key in InitData.Keys)
{
//initialize with the given object as data
object data;
bool useStd = false;
if (InitData[key] is NativeContainer)
{
data = ((NativeContainer)InitData[key]).Content;
useStd = true;
}
else data = InitData[key];
JQDescriptor jdesc = new JQDescriptor(GetDescriptorSelector(), "data", true, key, data);
if(useStd) jdesc.UseStandardSerializer = true;
//yield return jdesc;
result.Add(jdesc);
}
}
if (AuthorizationTemplates != null)
{
//register authorization templates
//yield return new JQDescriptor(GetDescriptorSelector(), "pm_registerAuthTemplates", true, AuthorizationTemplates);
result.Add(new JQDescriptor(GetDescriptorSelector(), "pm_registerAuthTemplates", true, AuthorizationTemplates));
}
//enumerate overriden method results
foreach(ScriptDescriptor sd in _getScriptDescriptors())
{
// yield return sd;
result.Add(sd);
}
if (AfterInit != null)
{
//to be executed after initialization
PrepareCallbackMethod(AfterInit, true);
//AfterInit.JQRawContent = String.Format(afterInitTemplate, AfterInit.JQRawContent, GetDescriptorSelector());
//yield return new JQDescriptor(GetDescriptorSelector(), "each", true, AfterInit);
result.Add(new JQDescriptor(GetDescriptorSelector(), "each", true, AfterInit));
}
if (ThemePath != null && ThemeCssName != null)
{
//load css file dynamically
string cssURL = VirtualURLHelper.Combine(ThemePath, ThemeCssName);
DynamicStylesheetDescriptor dsdesc = new DynamicStylesheetDescriptor(cssURL);
//yield return dsdesc;
result.Add(dsdesc);
}
if (cssRefs.Count > 0)
{
DynamicStylesheetDescriptor dsdesc = new DynamicStylesheetDescriptor(cssRefs);
//yield return dsdesc;
result.Add(dsdesc);
}
//final trigger
//yield return new JQDescriptor(GetDescriptorSelector(), "trigger", "_loadComplete");
//yield break;
return result;
}
/// <summary>
/// Helper method to create URL to an embedded resource
/// </summary>
/// <param name="type">The type of the server-side resource</param>
/// <param name="resourceName">The name of the server-side resource</param>
/// <returns>The URL reference to the resource</returns>
protected string GetEmbeddedURL(Type type, string resourceName)
{
//get base URL
string url = Page.ClientScript.GetWebResourceUrl(type, resourceName);
//attach name of the resource
return url.Replace("?", "?name=" + resourceName + "&");
}
}
我将它放在页面上的 ascx 控件中:页面:`<%@ Page Language="C#"AutoEventWireup="true"CodeBehind="p2.aspx.cs"Inherits="LWM.Implementation.Portal.Sample.TestOutputCache.p2"%>
<%@ Register TagPrefix="LWM"Src="~/Sample/TestOutputCache/testControl2.ascx"TagName="TestControl2"%>
<LWM:TestControl2 ID="testCached" runat="server" />
</div>
</form>
`
ascx: `<%@ Control Language="C#"AutoEventWireup="true"CodeBehind="testControl2.ascx.cs" Inherits="LWM.Implementation.Portal.Sample.testControl2"%><%@ OutputCache Duration="600"VaryByParam="None"%><%@ Register TagPrefix="Controls"Assembly="LWM.Implementation.Controls"Namespace="LWM.Implementation.Controls.JQComposite"%> 测试 2 功能(EVT) {
console.log("afterInit 2");
}
</AfterInit>
`
我还启用了 ascx 控件缓存。当页面第一次加载时一切正常,但是当页面从服务器缓存中获取时,所有脚本引用都丢失了......
我搜索了很多,找不到任何想法。所以,问题是当控件从服务器缓存加载时,scriptmanager 不生成脚本引用。
最佳答案
这是 OutputCaching 和 Script Manager 的错误,正式版本为 recognized by Microsoft
手动将脚本添加到 scriptmanager 有解决方法:
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Name="AjaxControlToolkit.Common.Common.js" Assembly="AjaxControlToolkit" />
<asp:ScriptReference Name="AjaxControlToolkit.ExtenderBase.BaseScripts.js" Assembly="AjaxControlToolkit" />
<asp:ScriptReference Name="AjaxControlToolkit.TextboxWatermark.TextboxWatermark.js"
Assembly="AjaxControlToolkit" />
</Scripts>
</asp:ScriptManager>
关于c# - ASP.NET ScriptManager 输出未包含在 ASP.NET 部分缓存 (ascx) 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881737/
我在 Web 表单上有一个按钮,位于 Ajax Toolkit 选项卡容器内的更新面板内,用于将文本框中的数据保存到数据库中。我有五个 if 语句来验证页面上的日期范围,并在范围无效时发出警报(例如)
我正在尝试扩展 ScriptManager 以简化处理具有多个资源文件(例如,不止一个脚本文件和 css)的资源。目标是我将能够将单个 ScriptReference 添加到 Scripts 并让它加
你好 我只是想知道为什么有些人建议 RegisterStartupScript() 调用客户端 js 而有些人建议 RegisterClientScriptBlock()。 请让我清楚这两者之间的区别
完整的错误是 The base class includes the field 'ScriptManager1', but its type (System.Web.UI.ScriptManager
基本上,我有一个母版页和数百个内容页。每个内容页面都包含 ToolKitScriptManager。现在,我想在母版页上添加 ScriptManager,当我尝试执行时,错误显示 “只有一个 Scri
我喜欢在 ASP.NET 中,ScriptManager 有一个复合部分,它允许指定多个 javascript 文件,并在运行时完成将它们全部合并到一个文件中的工作。 即. //input scrip
我正在使用 ScriptManager 控件从服务器 Web 服务加载搜索结果。页面上有一个文本框和按钮,用户可以在其中输入搜索词。当他们提交搜索时,会调用搜索页面的 Response.Redirec
我正在尝试从 .cs 类调用在 aspx 页面上实现的 js 函数。但是,ScriptManager 似乎不存在于 .cs 类中。基本上,.cs 文件是我在项目中使用的 dll 的一部分。我需要从 d
在我之前从事的项目中,我注意到 javascript 文件包含在脚本管理器中,如下所示: 我已经尝试搜索脚本引用和常规 之间的区别在 asp 页面中,但似乎找不到任何信息。使用脚本引用有优势
我有一个棘手的场景,我只想在某些情况下添加 ScriptManager 脚本引用,如下所示 我只想在特定条件下引用这个脚本,所以我做了如下 above
我有一个关于 Scriptmanager 的问题,我的问题是:为此,我需要在母版页中使用 ScriptManager:
我复制了一些代码来解决在 ASP.Net 中 AJAX 回发后运行 JavaScript 的问题。不幸的是,新代码在构建时给了我以下错误: The name 'ScriptManager' does
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章ScriptManager.RegisterStartupScript(
我已经使用 Bootstrap 弹出通知。来显示网站通知。现在它不起作用。我不明白为什么 System.Web.UI.ScriptManager.RegisterClientScriptBlock(P
我的母版页上有一个脚本管理器。我需要从一两个内容页面中删除 webresourse.axd,因为它会导致页面上的其他 javascript 出现问题 如何在这些页面上禁用脚本管理器? ScriptMa
我不认为我已经能够找到一个明确的答案,所以我会在这里问。何时需要 ScriptManager(或 ScriptManagerProxy,如果在母版页上使用 ScriptManager)? 例如,假设我
我创建了一个新的 ASP.NET Web 应用程序,调试后出现服务器错误 The control with ID 'WaitingPopup1' requires a ScriptManager on
我有一个 .net Web 表单方法可以在一次调用中调用 JavaScript 方法(来自用户控件),但仅触发第一个调用。后端代码为: bool isAddOnsExisting = priceSum
我有一个更新面板加载一个用户控件,这里的目标是在发生这种情况时调用一个特定的 JavaScript 函数。我认为这可以通过脚本管理器来完成,但如果有 html 替代方案则不必如此。 流程基本上如下:
这是与 this 完全相同的问题5 月的未答复。 (编辑)注意:this未答复的帖子准确描述了行为 - 在 中添加了额外的脚本由用户控件中的 ScriptManager.RegisterClient
我是一名优秀的程序员,十分优秀!