1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
//------------------------------------------------------------------------------
// <copyright file="Substitution.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
namespace System.Web.UI.WebControls {
using System;
using System.ComponentModel;
using System.Globalization;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
/// <devdoc>
/// <para></para>
/// </devdoc>
[
DefaultProperty("MethodName"),
Designer("System.Web.UI.Design.WebControls.SubstitutionDesigner, " + AssemblyRef.SystemDesign),
ParseChildren(true),
PersistChildren(false),
]
public class Substitution : Control {
/// <devdoc>
/// <para></para>
/// </devdoc>
public Substitution() {
}
/// <devdoc>
/// <para></para>
/// </devdoc>
[
DefaultValue(""),
WebCategory("Behavior"),
WebSysDescription(SR.Substitution_MethodNameDescr)
]
public virtual string MethodName {
get {
string s = ViewState["MethodName"] as string;
return s == null? String.Empty : s;
}
set {
ViewState["MethodName"] = value;
}
}
protected override ControlCollection CreateControlCollection() {
return new EmptyControlCollection(this);
}
// SECURITY CODE
// VSWhidbey 253188: Permission assert to support page running below full trust
[ReflectionPermission(SecurityAction.Assert, Flags=ReflectionPermissionFlag.MemberAccess)]
private HttpResponseSubstitutionCallback GetDelegate(Type targetType, string methodName) {
return (HttpResponseSubstitutionCallback)Delegate.CreateDelegate(
typeof(HttpResponseSubstitutionCallback), targetType, methodName);
}
protected internal override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
// VSWhidbey 84748: Temp fix, throw if we are within a cached control
Control parent = Parent;
while (parent != null) {
if (parent is BasePartialCachingControl) {
throw new HttpException(
SR.GetString(SR.Substitution_CannotBeInCachedControl));
}
parent = parent.Parent;
}
}
protected internal override void Render(HtmlTextWriter writer) {
RenderMarkup(writer);
}
internal void RenderMarkup(HtmlTextWriter writer) {
if (MethodName.Length == 0) {
return;
}
TemplateControl target = TemplateControl;
if (target == null) {
return;
}
// get the delegate to the method
HttpResponseSubstitutionCallback callback = null;
try {
callback = GetDelegate(target.GetType(), MethodName);
}
catch {
}
if (callback == null) {
throw new HttpException(
SR.GetString(SR.Substitution_BadMethodName, MethodName));
}
// add the substitution to the response
Page.Response.WriteSubstitution(callback);
}
}
}
|