Проектирование веб-архитектуры ASP.NET - часть 2 - PullRequest
2 голосов
/ 13 января 2009

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

Проблема в том, что он использует фреймы, чтобы иметь меню слева, заголовок вверху и главную страницу после этого. Это сделано для того, чтобы убедиться, что другие элементы статичны, а вы можете просматривать страницы. Теперь мы придумали решение для достижения этой цели, используя одну страницу и CSS, но проблема заключалась в реальной архитектуре нашего веб-приложения.

Мы хотим перейти на архитектуру MVC, чтобы сделать наши страницы более безопасными и управляемыми, однако в этом есть серьезная проблема. Каждый раздел нашей системы Интранет имеет перекрестные ссылки на другие страницы в других разделах. Так, например, скажем, у нас был раздел «Игры», и у нас был раздел «Люди, играющие в игры», но на самом деле это было просто использование рамки для указания на страницу, которая находится в другой папке в нашей системе Интранет, которая «Персонал» тогда «People.aspx» (чистый пример). Как архитектура MVC справится с чем-то подобным?

У нас есть страницы, отображаемые в совершенно разных областях нашей интрасети, которые на самом деле являются одной и той же страницей. Таким образом, наличие URL-адреса, например http://mysite/section/category/page, должно было бы ссылаться на http://mysite/anothersection/differentcategory/page.

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

Поднятые вопросы будут:

  • Должны ли мы иметь дубликаты страниц?
  • Есть ли способ перекрестной ссылки на страницу в разных разделах с помощью MVC?
  • Для системы Интранет, состоящей примерно из 400 различных страниц, MVC - это путь?

Приветствия

Ответы [ 4 ]

2 голосов
/ 13 января 2009
  • Тебе не нужно это делать, как идея сложных типов. Вы можете включить мини-представления в полноценный вид для разделения повторений.
  • Вы можете использовать Html.ActionLink для создания ссылок на страницы, и вы можете использовать Html.RenderPartial или Html.RenderAction для рендеринга целого действия на вашей странице.
  • Точно. Как я уже говорил, вы можете разбить повторение на маленькие компоненты и включать их, когда захотите.

Например ...

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

Для добавления ..

<asp:Content ID="DefaultContent" ContentPlaceHolderID="DefaultContentPlaceHolder" runat="server">
<% Html.BeginForm<CatalogController>(c => c.AddProduct(null), FormMethod.Post); %>
<% Html.RenderPartial("ProductFields", ViewData); %>
<%= Html.SubmitButton("Submit", "Add") %>
<% Html.EndForm(); %>
</asp:Content>

А для редактирования ...

<asp:Content ID="DefaultContent" ContentPlaceHolderID="DefaultContentPlaceHolder" runat="server">
<% Html.BeginForm<CatalogController>(c => c.EditProduct((Product)null), FormMethod.Post); %>
<% Html.RenderPartial("ProductFields", ViewData); %>
<%= Html.Hidden("Product.ID", ViewData.Model.ID) %>
<%= Html.SubmitButton("Submit", "Save") %>
<% Html.EndForm(); %>
</asp:Content>

И часть ProductFields выглядела так

<% Product product = ViewData.Model; %>
<% IEnumerable<Category> categories = ViewData["Categories"] as IEnumerable<Category>; %>
<table>
    <tr>
        <td><%= Html.Label("Product.Name", "Name") %></td>
        <td><%= Html.TextBox("Product.Name", product.Name) %></td>
    </tr>
    <tr>
        <td><%= Html.Label("Product.Price", "Price") %></td>
        <td><%= Html.TextBox("Product.Price", product.Price) %></td>
    </tr>
    <tr>
        <td><%= Html.Label("Product.Description", "Description") %></td>
        <td><%= Html.TextBox("Product.Description", product.Description) %></td>
    </tr>
    <tr>
        <td><%= Html.Label("Product.IsActive", "Is active") %></td>
        <td><%= Html.CheckBox("Product.IsActive", product.IsActive) %></td>
    </tr>
    <tr>
        <td><%= Html.Label("Product.IsFeatured", "Is featured") %></td>
        <td><%= Html.CheckBox("Product.IsFeatured", product.IsFeatured.HasValue ? product.IsFeatured.Value : false) %></td>
    </tr>
    <tr>
        <td><%= Html.Label("Product.CategoryID", "Category") %></td>
        <td><%= Html.DropDownList("Product.CategoryID", new SelectList(categories, "ID", "Name")) %></td>
    </tr>
</table>

Итак, как вы можете видеть, вы можете легко разбивать ваши страницы по мере необходимости, включать их и очень легко передавать данные в них с помощью ASP.NET MVC.

1 голос
/ 13 января 2009

Кеззер - вы уверены, что хотите взять существующую (и работающую, я полагаю) систему и полностью переписать ее только для предполагаемых преимуществ MVC? Я знаю, что это не совсем отвечает на ваш вопрос, но я бы серьезно подумал, действительно ли архитектура MVC сделает ваших клиентов более счастливыми, чем архитектура Webforms, тем более что они никогда не заметят.

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

0 голосов
/ 13 января 2009
  • Должны ли мы иметь дубликаты страниц?

номер

  • Есть ли способ перекрестной ссылки на страницу в разных разделах с помощью MVC?

Да.

  • Для системы Интранет, состоящей примерно из 400 различных страниц, MVC - это путь?

как упомянуто theBadDawg , если эти 400 страниц можно разделить на группы страниц, которые имеют что-то общее, это выполнимо. Исходя из ваших категорий и разделов , звучит как логическая группировка страниц.

0 голосов
/ 13 января 2009

Я отвечу на третью часть вашего вопроса о MVC, как это сделать:

MVC намного проще работать в команде. Это особенно хорошо работает в тандеме дизайнер / программист, потому что дизайнер может работать над тем, что он / она знает, а программист может работать над тем, что он знает (давайте посмотрим правде в глаза, программистов очень мало) и вместо того, чтобы работать в одном пространстве (страница .aspx) конструктор может работать в пространстве просмотра .aspx, а программист может работать в пространстве контроллера .cs.

Существует также дополнительное преимущество многократного использования одной страницы. Используя несколько разных ActionNames и немного сконфигурировав свои частичные страницы и переменные ViewData, вы можете использовать одну страницу снова и снова, чтобы охватить практически любой вариант использования. Мне было очень сложно выполнить аналогичную конфигурацию с WebForms.

Средства управления маршрутизацией, которыми вы обладаете в MVC, невероятно надежны, а благодаря интеллектуальному контроллеру и дизайну представления вы можете в итоге довести интранет с 400 страницами до примерно 20 контроллеров с 80 страницами. Я перестраиваю сайт ESPN-подобной интрасети, который был создан на веб-формах и имел около 200 страниц, и все это прекрасно вписывается в 8 контроллеров и 50 представлений.

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