ASP.NET MVC: использование LINQ to XML для визуализации (X) HTML
-
06-07-2019 - |
Вопрос
Было много дискуссий о механизмах просмотра для ASP.NET MVC и некоторых критических замечаний по поводу встроенного " tag-soup " с циклами и тому подобное.
Альтернативой или дополнением было использование HTML-помощников, которые являются просто встроенными вызовами методов.
Сегодня, когда я смотрю в HTML-помощники ASP.NET MVC, они используют класс TagBuilder .
Я предлагаю использовать LINQ to XML, чтобы получить строго типизированный и правильно отформатированный (X) HTML .
XDocument output = new XDocument();
XElement root = new XElement("div",
new XAttribute("class", "root_item"));
XElement iconImage = new XElement("img",
new XAttribute("src", ResolveUrl("~/image.gif")),
new XAttribute("alt", "This is an image"));
XElement link = new XElement("a",
new XAttribute("class", "link"),
new XAttribute("href", "http://google.com"),
new XText("Link to Google"));
root.Add(link);
root.Add(iconImage);
output.Add(root);
Мне это нравится, потому что это похоже на строго типизированные элементы управления в WebForms, где вы можете создать новую кнопку и добавить ее в коллекцию элементов управления другого элемента управления.
Есть ли какие-либо очевидные проблемы или ограничения в этом?
Решение
Я могу думать о двух проблемах вышеупомянутого метода. Во-первых,
XElement iconImage = new XElement("img",
new XAttribute("src", ResolveUrl("~/image.gif")),
new XAttribute("alt", "This is an image"));
Ссылаясь на то, что вы пишете выше, мы можем получить что-то вроде:
<img src=<%=whatever%> alt=<%=whatever%> />
Это может быть личное суждение или что-то подобное, но я, безусловно, проголосую за еще один " human " удобочитаемый. Правильно, использование LINQ 2 XML может избавить от странного & Lt;%}% & Gt; это блуждает в моих страницах aspx, но в то же время, вы делаете это " хорошие мальчики " выглядит неуклюже Р>
Во-вторых, может возникнуть проблема с производительностью. Я думаю, что синтаксический анализ и выполнение LINQ 2 XML может быть довольно медленным, хотя у меня нет никаких данных по этому поводу.
Лично я все еще экспериментирую с платформой MVC, похоже, что я возвращаюсь к старым временам, таким как ASP или PHP 3.X, так как почти все интерактивные части обрабатываются явно, а не ориентированная на окна / GUI-OOP ASP Dot Net Фреймворк. Я думаю, что основная причина, по которой я буду использовать MVC, заключается в том, что он может гарантировать наилучшее качество HTML-кодов на стороне клиента.
Другие советы
Это отличная идея! Единственная проблема, которую я вижу, это использование C #. ;) В VB.NET значительно улучшена поддержка создания XML с помощью функции XML-литералов.
Код, который вы перечислите в своем вопросе, может быть написан так в VB.NET. (С добавлением текста & Quot; это ссылка & Quot; , поскольку в вашем примере не было текста внутри элемента a
.)
Dim root = <div class="root_item">
<img src=<%= ResolveUrl("~/image.gif") %> alt="This is an image"/>
<a class="link" href="http://google.com">This is a link</a>
</div>
Есть еще теги <%= ... %>
, но они проверяются на достоверность во время компиляции. Если этот код был возвращен функцией, возвращающей тип XElement, этот фрагмент Xhtml можно было бы повторно использовать в другом месте сайта.
У меня есть проект на CodePlex, который использует литералы XML VB.NET в качестве настраиваемого механизма просмотра ASP.NET MVC по адресу http: //vbmvc.codeplex.com . Он основан на коде от Дмитрий Робсман , руководитель отдела продуктов для ASP.NET в Microsoft. Представления - это классы VB.NET, а мастер-страницы - базовые классы. Вы new-up используете классы с частичным представлением вместо ссылки на них через строку имени, так что это также дополнительная проверка во время компиляции. Вместо класса HtmlHelper, который возвращает строки, есть класс XhtmlHelper, который возвращает XElement и работает аналогично тому, что вы предложили.