На самом деле я уже спрашивал об этом в эта почта, хотя мы вернулись к чертежной доске и обнаружили, что это намного сложнее, чем мы думали изначально. Мы разрабатываем большую (и очень надежную) систему Интранет, которая за эти годы претерпела огромные изменения.
Проблема в том, что он использует фреймы, чтобы иметь меню слева, заголовок вверху и затем главную страницу. Это делается для того, чтобы другие элементы оставались статичными, пока вы можете прокручивать страницы. Теперь мы придумали решение для достижения этой цели, используя одну страницу и CSS, но проблема заключалась в реальной архитектуре нашего веб-приложения.
Мы хотим перейти на архитектуру MVC, чтобы сделать наши страницы более безопасными и управляемыми, однако с этим связана серьезная проблема. В каждом разделе нашей системы интрасети есть перекрестные ссылки на другие страницы в других разделах. Так, например, предположим, что у нас есть раздел под названием «Игры», и в нем есть раздел под названием «Люди, играющие в игры», но на самом деле здесь просто использовался фрейм, указывающий на страницу, которая находится в другой папке в нашей системе интрасети под названием «Персонал», затем «People.aspx» (чистый пример). Как архитектура MVC справится с подобным?
У нас есть страницы, отображаемые в совершенно разных областях нашей интрасети, которые на самом деле являются одной и той же страницей. Таким образом, наличие URL-адреса, такого как http: // mysite / section / category / page, должно было бы указывать на http: // mysite / другой раздел / разные категории / страница.
Надеюсь, это имеет смысл для людей, имеющих опыт работы с архитектурой MVC, а также с устаревшими архитектурами, такими как использование фреймов, как это делаем мы.
Поднятые вопросы будут следующими:
Ваше здоровье





Кеззер - вы уверены, что хотите взять существующую (и, я полагаю, работающую) систему и полностью переписать ее только для предполагаемых преимуществ MVC? Я знаю, что это не совсем ответ на ваш вопрос, но я бы серьезно подумал, действительно ли архитектура MVC сделает ваших клиентов более счастливыми, чем архитектура Webforms - тем более, что они этого никогда не заметят.
В чем-то похожем, взгляните на статью Джоэла о Архитектура Астронавты. Это не относится к вашей проблеме, но отвечает нереалистичным ожиданиям, которые мы иногда получаем, когда смотрим на новые технологии.
Например...
Я работаю над небольшим приложением-витриной для друга, и я обнаружил, что создаю представление для добавления и редактирования продукта. Проблема в том, что я использовал тот же макет для полей. Итак, я создал пользовательский элемент управления 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.
К сожалению, мои знания MVC, когда дело доходит до ASP.NET MVC, довольно ограничены, поэтому понять этот пример сложно. Могу ли я просто создать другую страницу в другом разделе, используя Html.ActionLink со страницей в качестве параметра или что-то в этом роде?
Html.ActionLink генерирует URL-адрес на основе контроллера / действия. Таким образом, ваши URL-адреса не устареют, если вы измените структуру маршрутизации.
Я отвечу на третью часть вашего вопроса о MVC:
Над MVC намного проще работать в команде. Это особенно хорошо работает в тандеме дизайнер / программист, потому что дизайнер может работать над тем, что он / она знает, а программист может работать над тем, что он знает (давайте посмотрим правде в глаза, программистов очень мало), вместо того, чтобы работать в одном и том же пространстве. (страница .aspx) дизайнер может работать в пространстве просмотра .aspx, в то время как программист может работать в пространстве контроллера .cs.
Существует также дополнительное преимущество использования одной страницы много раз. Используя несколько разных ActionNames и немного настроив частичные страницы и переменные ViewData, вы можете использовать одну страницу снова и снова, чтобы охватить практически любой вариант использования. Мне было очень сложно выполнить аналогичную настройку с WebForms.
Элементы управления маршрутизацией, которые у вас есть в MVC, невероятно надежны, а с интеллектуальным контроллером и дизайном представления вы можете в конечном итоге сократить Интранет на 400 страниц до 20 или около того контроллеров с 80 страницами. Я перестраиваю сайт интрасети, подобный ESPN, который был выполнен на WebForms, у которого было около 200 страниц, и все это прекрасно вписывается в 8 контроллеров и 50 представлений.
Нет.
Да.
как упоминалось в theBadDawg, если вы можете разделить эти 400 страниц на группы страниц, которые имеют что-то общее, это выполнимо. Судя по вашим категории и разделы, похоже, что у вас есть логическая группировка страниц.
У нас есть, но они немногочисленны и даже принадлежат к одной и той же категории, они могут не иметь отношения друг к другу. Я должен признать, что это странная система, хотя на этой неделе я собираюсь обсудить ее пересмотр. Есть ли какие-нибудь достойные ресурсы (книги), чтобы научиться этим вещам?
Мне очень нравится этот пост, и вы очень хорошо замечаете. Проблема, с которой мы сталкиваемся, заключается в том, что система развивается так быстро, что ее становится трудно поддерживать, особенно с использованием фреймов. У нас есть отдельные страницы index.htm для каждого раздела. Однако я полностью понимаю вашу точку зрения.