- 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/
创建使用.NET框架的asp.net页面时,访问该页面的客户端是否需要在其计算机上安装.NET框架? IE。用户访问www.fakesite.com/default.aspx,如果他们没有安装框架,他
我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。 我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我一直想知道为什么微软为这样一个伟大的平台选择了一个如此奇怪的、对搜索引擎不友好的名称。他们就
.Net Framework .Net .NET Standard的区别 1、.NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套
如果有选择的话,您会走哪条路? ASP.NET Webforms + ASP.NET AJAX 或 ASP.NET MVC + JavaScript Framework of your Choice
我有一个 Web 服务,它通过专用连接通过 https 使用第三方 Web 服务,我应用了 ServicePointManager.ServerCertificateValidationCallbac
为什么我应该选择ASP.NET Web Application (.NET Framework)而不是ASP.NET Core Web Application (.NET Framework)? 我在
我在网络上没有找到任何关于包含 .NET Standard、.NET Core 和 .NET Framework 项目的 .NET 解决方案的公认命名约定。 就我而言,我们在 .NET 框架项目中有以
.NET Compact 是 .NET 的完美子集吗? 假设我考虑了屏幕大小和其他限制并避免了 .NET Compact 不支持的类和方法,或者 .NET Compact 是一个不同且不兼容的 GUI
我已经阅读了所有我能找到的关于 connectionManagement 中的 maxconnection 设置的文章:即 http://support.microsoft.com/kb/821268
我现在正在使用asp.net mvc,想知道使用内置的Json或 Json.Net哪个是更好的选择,但我不确定一个人是否比另一个人有优势。 另外,如果我确实选择沿用Json.Net的路线,那么我应该选
在 Visual Studio 中,您至少可以创建三种不同类型的类库: 类库(.NET Framework) 类库(.NET 标准) 类库(.NET Core) 虽然第一个是我们多年来一直使用的,但我
.NET 和 ASP.NET 之间有什么区别?它们有什么关系? 最佳答案 ASP.Net 基于 .Net 框架构建,提供有关 Web 开发的附加功能。 你可以去看看wikipedia article
在安装更高版本(3.0)之前,我需要安装.net框架1.1和2.0吗?或者单独安装 3.0 框架就足够了,并为在早期框架版本上编写的软件提供支持?谢谢 ,丽然 最佳答案 不,您不必安装以前的框架。 我
我正在开发一个项目,人们可以“更新”类别,例如更改类别的名称。我收到以下消息 This is called after clicking update 按钮 with the SQL statemen
.NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复-- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.Coo
我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得很好,但我只是尝试在脚本中放置一些异常处理,但我无法弄清楚如何判断我的 C# 代码抛出了哪种类型的异
我需要你的帮助, 比如我有一个小数类型的变量,我想这样取整。 例如 3.0 = 3 3.1 = 4 3.2 = 4 3.3 = 4 3.4 = 4 3.5 = 4 3.6 = 4 3.7 = 4 3.
我使用过这样的代码:http://msdn.microsoft.com/en-us/library/dw70f090.aspx在 ASP.NET 中工作之前访问数据库(2-3 年前)。我没有意识到我正
自 ConfigurationManager .NET Standard 中不存在,检索正在执行的程序集的应用程序设置的最佳方法是什么,无论是 web.config或 appSettings.{env
我是一名优秀的程序员,十分优秀!