mmilic, после ваш ответ на мою предыдущую идею ..
Никакой дополнительной логики не требуется! В том-то и дело, что вы ничего не делаете с этими классами, просто заключаете их в какую-то инстанцированную пузырчатую пленку! :)
Ладно, я собирался просто поставить точку, но я хотел увидеть эту работу для себя, поэтому я собрал немного очень грубого кода, но концепция есть, и, кажется, работает.
Извинения за длинный пост
SafeLoader
По сути, это будет тот «пузырь», о котором я упоминал. Он получит элементы управления HTML, улавливающие любые ошибки, возникающие во время рендеринга.
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 "<span style=\"color: red; font-weight:bold; font-size: smaller;\">" +
"Rob + Controls = FAIL (" +
ctlType + " rendering failed) Sad face :(</span>";
}
}
}
И некоторые элементы управления ..
Ладно, я просто смоделировал вместе два элемента управления, один из которых выбрасывает, а другой будет отображать мусор. Укажи здесь, я не дерьмо. Они будут заменены вашими пользовательскими элементами управления.
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("<b>Holy crap this control works</b>");
}
}
Страница
ОК, так что давайте посмотрим на «тестовую» страницу. Здесь я просто создаю экземпляры элементов управления, беру их html и выводю их, я буду следить за мыслями о поддержке дизайнеров и т. Д.
Код страницы за
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);
}
Мысли
Хорошо, я знаю, о чем вы думаете: «Эти элементы управления создаются программно, а как насчет поддержки дизайнера? Я потратил чертовы часы на то, чтобы сделать эти элементы управления приятными для дизайнера, теперь вы возитесь с моим моджахедом».
ОК, так что я пока еще не проверял это (вероятно, сделаю это через минуту!), Но идея здесь в том, чтобы переопределить метод CreateChildControls для страницы, взять экземпляр каждого элемента управления, добавленного в форму, и запустить его через SafeLoader. Если код проходит, вы можете добавить его в коллекцию Controls как обычно, если нет, то вы можете создавать ошибочные литералы или что-то еще, до вас, мой друг.
Наконец ..
Опять же, извините за длинный пост, но я хотел получить здесь код, чтобы мы могли обсудить это :)
Я надеюсь, что это помогает продемонстрировать мою идею:)
Обновление
Протестировано путем добавления элемента управления в конструктор и переопределения метода CreateChildControls с этим, работает нормально, может потребоваться некоторая очистка, чтобы улучшить внешний вид, но я оставлю это вам;)
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("<b>Problem Occurred Rendering " +
ctlType + " '" + ctl.ID + "'.</b>");
}
}
}
Наслаждайтесь!