mmilic, urmând de la răspunsul dvs. la idee prealabilă ..
Nu este necesară logica suplimentară! Acesta este motivul, nu faceți nimic pentru clasele în cauză, pur și simplu înfășurați-le în unele instantiation bubble-wrap! :)
OK, am vrut să fac doar un punct de glont, dar am vrut să văd această lucrare pentru mine, așa că am dat peste un cod foarte brutal, dar conceptul este acolo și pare să funcționeze.
APOLOGIILE PENTRU POSTUL LUNG
The SafeLoader
Acest lucru va fi, în principiu, "balonul" pe care l-am menționat. Acesta va primi controlul HTML, prinsând orice eroare care apar în timpul procesului de redare.
public class SafeLoader
{
public static string LoadControl(Control ctl)
{
//In terms of what we could do here, its down
//to you, I will just return some basic HTML saying
//I screwed up.
try
{
//Get the Controls HTML (which may throw)
//And store it in our own writer away from the
//actual Live page.
StringWriter writer = new StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);
ctl.RenderControl(htmlWriter);
return writer.GetStringBuilder().ToString();
}
catch (Exception)
{
string ctlType = ctl.GetType().Name;
return "" +
"Rob + Controls = FAIL (" +
ctlType + " rendering failed) Sad face :(";
}
}
}
Și unele controale ..
Ok, tocmai am batjocorit două controale aici, una va arunca cealaltă va face junk. Arătați aici, eu nu dau nimic. Acestea vor fi înlocuite cu comenzile dvs. personalizate ..
BadControl
public class BadControl : WebControl
{
protected override void Render(HtmlTextWriter writer)
{
throw new ApplicationException("Rob can't program controls");
}
}
GoodControl
public class GoodControl : WebControl
{
protected override void Render(HtmlTextWriter writer)
{
writer.Write("Holy crap this control works");
}
}
Pagina
OK, asa ca lasa sa te uiti la pagina "test". Aici instalez doar controalele, apuca html-ul si iesi-l, voi urma cu gandurile in sprijinul designerului etc.
Codul paginii-din spate
protected void Page_Load(object sender, EventArgs e)
{
//Create some controls (BadControl will throw)
string goodHtml = SafeLoader.LoadControl(new BadControl());
Response.Write(goodHtml);
string badHtml = SafeLoader.LoadControl(new GoodControl());
Response.Write(badHtml);
}
Gânduri
OK, stiu la ce te gandesti ", aceste controale sunt instantiate programatic, ce inseamna sprijinul designerului? Mi-am petrecut orele de frecare pentru a obtine aceste controale placute designerului, acum imi pui mojo-ul".
OK, so I havent really tested this yet (probably will do in a min!) but the idea here is to override the CreateChildControls method for Pagina, and take the instance of each control added on the form and run it through The SafeLoader. If the code passes, you can add it to the Controls collection as normal, if not, then you can create erroneous literals or something, up to you my friend.
In cele din urma..
Din nou, îmi pare rău pentru postul lung, dar am vrut să obțin codul aici pentru a putea discuta acest lucru :)
Sper ca acest lucru sa-mi demonstreze ideea :)
Actualizați
Testați prin îndesarea unui control asupra designerului și înlăturând metoda CreateChildControls cu acest lucru, funcționează bine, poate avea nevoie de ceva curat pentru a face lucrurile mai bine, dar vă voi lăsa asta;)
protected override void CreateChildControls()
{
//Pass each control through the Loader to check
//its not lame
foreach (Control ctl in Controls)
{
string s = SafeLoader.LoadControl(ctl);
//If its bad, smack it downnnn!
if (s == string.Empty)
{
ctl.Visible = false;//Prevent Rendering
string ctlType = ctl.GetType().Name;
Response.Write("Problem Occurred Rendering " +
ctlType + " '" + ctl.ID + "'.");
}
}
}
Bucurați-vă!