📄 scriptusercontrol.cs
字号:
#region [ Methods ]
/// <summary>
/// Ensures a ScriptManager exists on the Page for this Control
/// </summary>
private void EnsureScriptManager()
{
if (_scriptManager == null)
{
_scriptManager = ScriptManager.GetCurrent(Page);
if (_scriptManager == null)
{
throw new HttpException(Resources.E_NoScriptManager);
}
}
}
/// <summary>
/// Finds a control reference by its ID
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public override Control FindControl(string id)
{
Control control = base.FindControl(id);
if (control != null)
{
return control;
}
for (Control container = NamingContainer; container != null; container = container.NamingContainer)
{
control = container.FindControl(id);
if (control != null)
{
return control;
}
}
// NOTE: [rb] I'm not implementing ResolveControlID just yet. I prefer to use a colon (:) seperated ID name to get to controls inside of a naming container
// e.g. TargetControlID="LoginView1:LoginButton" works just as well
return null;
}
/// <summary>
/// Render's the begin tag of the control
/// </summary>
/// <param name="writer"></param>
public virtual void RenderBeginTag(HtmlTextWriter writer)
{
if (null == writer)
{
throw new ArgumentNullException("writer");
}
AddAttributesToRender(writer);
HtmlTextWriterTag tagKey = TagKey;
if (tagKey != HtmlTextWriterTag.Unknown)
{
writer.RenderBeginTag(tagKey);
}
else
{
writer.RenderBeginTag(TagName);
}
}
/// <summary>
/// Renders the end tag of the control
/// </summary>
/// <param name="writer"></param>
public virtual void RenderEndTag(HtmlTextWriter writer)
{
if (null == writer)
{
throw new ArgumentNullException("writer");
}
writer.RenderEndTag();
}
/// <summary>
/// Handles OnLoad
/// </summary>
/// <param name="e">event args</param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ScriptObjectBuilder.RegisterCssReferences(this);
}
/// <summary>
/// Fires the PreREnder event
/// </summary>
/// <param name="e"></param>
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
EnsureScriptManager();
ScriptManager.RegisterScriptControl(this);
EnsureID();
if (SupportsClientState)
{
ScriptManager.RegisterHiddenField(this, ClientStateFieldID, SaveClientState());
Page.RegisterRequiresPostBack(this);
}
}
/// <summary>
/// Creates a Style for this control
/// </summary>
/// <returns></returns>
protected virtual Style CreateControlStyle()
{
return new Style(ViewState);
}
/// <summary>
/// Loads the client state data
/// </summary>
/// <param name="clientState"></param>
protected virtual void LoadClientState(string clientState)
{
}
/// <summary>
/// Saves the client state data
/// </summary>
/// <returns></returns>
protected virtual string SaveClientState()
{
return null;
}
/// <summary>
/// Saves the ViewState for this control
/// </summary>
/// <returns></returns>
protected override object SaveViewState()
{
if (ControlStyleCreated)
{
((IStateManager)ControlStyle).SaveViewState();
}
return base.SaveViewState();
}
/// <summary>
/// Executed when post data is loaded from the request
/// </summary>
/// <param name="postDataKey"></param>
/// <param name="postCollection"></param>
/// <returns></returns>
protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
if (SupportsClientState)
{
string clientState = postCollection[ClientStateFieldID];
if (!string.IsNullOrEmpty(clientState))
{
LoadClientState(clientState);
}
}
return false;
}
/// <summary>
/// Executed when post data changes should invoke a chagned event
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate", Justification = "Maintaining consistency with IPostBackDataHandler")]
protected virtual void RaisePostDataChangedEvent()
{
}
/// <summary>
/// Renders the control to the writer
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
RenderBeginTag(writer);
RenderContents(writer);
RenderEndTag(writer);
ScriptManager.RegisterScriptDescriptors(this);
}
/// <summary>
/// Renders the contents of the control
/// </summary>
/// <param name="writer"></param>
protected virtual void RenderContents(HtmlTextWriter writer)
{
base.Render(writer);
}
/// <summary>
/// Adds attributes to the writer
/// </summary>
/// <param name="writer"></param>
protected virtual void AddAttributesToRender(HtmlTextWriter writer)
{
if (ID != null)
{
writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
}
if (TagKey == HtmlTextWriterTag.Span || TagKey == HtmlTextWriterTag.A)
{
AddDisplayInlineBlockIfNeeded(writer);
}
if (ControlStyleCreated && !ControlStyle.IsEmpty)
{
// unfortunately since we're not a "WebControl" we can't pass ourselves as a UrlResolver
ControlStyle.AddAttributesToRender(writer);
}
foreach (string key in Attributes.Keys)
{
writer.AddAttribute(key, Attributes[key]);
}
}
private void AddDisplayInlineBlockIfNeeded(HtmlTextWriter writer)
{
if (BorderStyle != BorderStyle.NotSet || !BorderWidth.IsEmpty || !Height.IsEmpty || !Width.IsEmpty)
{
if (Request.Browser.IsBrowser("FireFox") || Request.Browser.IsBrowser("Mozilla"))
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "-moz-inline-box");
}
else
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "inline-block");
}
}
}
/// <summary>
/// Gets the ScriptDescriptors that make up this control
/// </summary>
/// <returns></returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Method is expensive")]
protected virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
if (!Visible) return null;
EnsureID();
// store descriptors for this object
List<ScriptDescriptor> descriptors = new List<ScriptDescriptor>();
// build the default description
ScriptControlDescriptor descriptor = new ScriptControlDescriptor(ClientControlType, ClientID);
DescribeComponent(descriptor);
descriptors.Add(descriptor);
// return the description
return descriptors;
}
/// <summary>
/// Gets the script references for this control
/// </summary>
/// <returns></returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Method is expensive")]
protected virtual IEnumerable<ScriptReference> GetScriptReferences()
{
if (!Visible) return null;
List<ScriptReference> refs = new List<ScriptReference>();
refs.AddRange(ScriptObjectBuilder.GetScriptReferences(GetType()));
if (ScriptPath.Length > 0)
{
refs.Add(new ScriptReference(ScriptPath));
}
return refs;
}
/// <summary>
/// Describes the settings for this control.
/// </summary>
/// <param name="descriptor"></param>
protected virtual void DescribeComponent(ScriptComponentDescriptor descriptor)
{
ScriptObjectBuilder.DescribeComponent(this, descriptor, this, this);
if (SupportsClientState)
{
descriptor.AddElementProperty("clientStateField", ClientStateFieldID);
}
}
/// <summary>
/// Handles a callback event
/// </summary>
/// <returns></returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification="Method has a side-effect")]
protected virtual string GetCallbackResult()
{
string argument = _callbackArgument;
_callbackArgument = null;
return ScriptObjectBuilder.ExecuteCallbackMethod(this, argument);
}
/// <summary>
/// Raises a callback event
/// </summary>
/// <param name="eventArgument"></param>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate", Justification = "Maintaining consistency with ICallbackEventHandler")]
protected virtual void RaiseCallbackEvent(string eventArgument)
{
_callbackArgument = eventArgument;
}
#endregion
#region [ IScriptControl Members ]
IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()
{
return GetScriptDescriptors();
}
IEnumerable<ScriptReference> IScriptControl.GetScriptReferences()
{
return GetScriptReferences();
}
#endregion
#region [ IControlResolver Members ]
public Control ResolveControl(string controlId)
{
return FindControl(controlId);
}
#endregion
#region [ IPostBackDataHandler Members ]
bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
{
return LoadPostData(postDataKey, postCollection);
}
void IPostBackDataHandler.RaisePostDataChangedEvent()
{
RaisePostDataChangedEvent();
}
#endregion
#region [ ICallbackEventHandler Members ]
string ICallbackEventHandler.GetCallbackResult()
{
return GetCallbackResult();
}
void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
{
RaiseCallbackEvent(eventArgument);
}
#endregion
#region [ IClientStateManager Members ]
bool IClientStateManager.SupportsClientState
{
get { return SupportsClientState; }
}
void IClientStateManager.LoadClientState(string clientState)
{
LoadClientState(clientState);
}
string IClientStateManager.SaveClientState()
{
return SaveClientState();
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -