asp.net usercontrol против customcontrol против stringbuilder - PullRequest
1 голос
/ 22 декабря 2010

Я создаю каталог товаров, который отображает от 50 до 100 товаров на странице.Поскольку я хочу иметь разные разделы просмотра на своем сайте, я поместил каждый продукт в UserControl.Ну, не сами продукты, конечно, но некоторые ярлыки, div и изображения.Затем я устанавливаю его свойства во время выполнения при обработке результатов базы данных.Таким образом, преимущество в том, что мне нужно всего лишь изменить контроль продукта в 1 месте для всего сайта.Я помещаю элементы управления на страницу, используя LoadControl в цикле.

Однако страницы загружаются не так быстро, как другие страницы, которые обрабатывают тот же запрос БД и выводят тот же HTML, используя StringBuilder.И так как я хочу, чтобы мой сайт работал хорошо, если / когда он получает приличный трафик, я беспокоюсь об этом.Я еще не проводил никаких тестов, но я ясно вижу разницу.

Достаточно моих проблем!Мои вопросы к вам: «Есть ли альтернативы, которые быстрее, чем использование LoadControl с настраиваемым контролем, но которые легко поддерживаются (или, по крайней мере, в 1 месте)?»1009 * Создание настраиваемого элемента управления (хотя я никогда не делал этого и не знаю на 100%, если это ускорит процесс)

Продолжите с методом StringBuilder и поместите CreateProduct в мой базовый класс Отказ от всей идеи поддержания продукта в 1 месте

Я надеюсь, что у вас, ребята, были схожие ситуации, поэтому я очень хотел бы услышать от вас!

[править] Код [/ edit] У меня нет точного кода пользовательского контроля здесь, но я отредактирую этот пост, когда вернусь домой ... но вот упрощенная идея:

1) Получение результата моей базы данных (с использованием Subsonic2.2 как мой DAL)

DAL.ProductCollection coll = new DAL.ProductCollection();
if(coll.count > 0)
{
   foreach(DAL.Product item in coll)
   {
     Control p = LoadControl("FeaturedProduct.ascx");
     placeholder.Controls.Add(p);

     //Set properties
     p.title = item.Title;
     p.img = GetImage(item.Guid);
     ....etc
   }
}

Мой пользовательский контроль сам по себе состоит только из 3 литеральных элементов управления и 1 элемента управления изображением.

Но я отправлю полный код, когда вернусь домой!Спасибо

Ответы [ 4 ]

2 голосов
/ 22 декабря 2010

Допустим, у вас есть список продуктов List<Product> в результате запроса к базе данных.Вы можете привязать элемент управления Repeater к этому списку, а затем в своей разметке добавить UserControl внутри ретранслятора.

Вот пример с классом Product, как показано:

class Product{ public string Sku{ get; set; } public string Name{ get; set; } }

В объявлении разметки:

<asp:Repeater runat="server" ID="ProductsRepeater" >
    <ItemTemplate>
        <uc1:ProductsUserControl runat="server" ID="productsControl" Sku='<%# Eval("Sku")%>' Name='<%# Eval("Name") %>'/>
    </ItemTemplate>
</asp:Repeater>

Затем в вашем коде:

protected void Page_Load(object sender, EventArgs 
{
    ProductsRepeater.DataSource = myProductsList;
    ProductsRepeater.DataBind();
}

Это добавит 1 пользовательский элемент управления для каждой записи в списке продуктов и свяжет свойства Sku и Name объекта Property с соответствующимсвойства пользовательского элемента управления.

Если этого недостаточно, может быть, что-то не так с вашим пользовательским элементом управления?

2 голосов
/ 22 декабря 2010

Вы пытались выключить Viewstate в своем UserControl?Если вы создаете разметку, используя StringBuilder, тогда не будет никакого Viewstate, переданного туда и обратно для какой-либо из этой разметки.Если вы используете веб-элементы управления ASP по умолчанию, они по умолчанию будут иметь Viewstate, который будет передаваться взад и вперед во время загрузки страниц и обратной передачи, и может быть довольно большим в зависимости от того, какие веб-элементы управления используются в UserControl и повторяется от 50 до100 раз.

Редактировать: Если Viewstate не проблема, вы убедились, что разметка, сгенерированная UserControl, совпадает или разумно эквивалентна разметке, которую вы генерируете в StringBuilder?

Еще одна важная вещь, которую нужно сделать, это сравнить время сервера и клиента.Если разметка отличается, время визуализации клиента может заметно измениться.Если время сервера и клиента одинаково (или незначительно различается), вам нужно посмотреть на размеры вывода сервера и время передачи.

1 голос
/ 22 декабря 2010

Я бы переключился на использование элемента управления ASP.NET Server и переопределил бы его метод Render.Это больше похоже на ваше решение StringBuilder в том смысле, что вы можете использовать HtmlTextWriter, предоставленный методу, для создания выходного HTML-кода, аналогично тому, как вы делали это с вашим строителем строк.Но в то же время вы получаете структуру элемента управления, которая дает вам возможность добавлять свойства, управлять состоянием и т. Д. И, поскольку серверный элемент управления скомпилирован, я думаю, что он обычно работает немного лучше, чем пользовательский элемент управления.

Я бы также создал другой серверный элемент управления, который является контейнером, который используется для создания вашего списка элементов управления.Не уверен, что это будет намного более производительно, но это хорошая практика, которая сделает ваш код более легким для повторного использования и поддержки.

1 голос
/ 22 декабря 2010

UserControl звучит как качественное решение для того, что вы делаете.Не отказывайтесь от этой идеи.Абстракция заставляет мир вращаться.

Я попросил вас показать вашу отметку UserControl.Кроме того, вам не нужно использовать LoadControl(), если вы не строите все это в коде позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...