Как создать приложение портала с несколькими представлениями в ASP.NET MVC

StackOverflow https://stackoverflow.com/questions/1597292

Вопрос

Я только что смотрел презентацию Скотта Хансельмана на ASP.NET MVC в Сан-Франциско.Поразмыслив об этом некоторое время, я зашел в тупик относительно того, как наилучшим образом подойти к созданию ASP.NET сайт на основе MVC, который имеет структуру [portal | modular | multi-view] (выберите ваше любимое определение).

Чтобы дать вам представление о том, что мне нужно, моя компания создает множество приложений в стиле портала для наших клиентов, которые включают модуль сопоставления, который может отвечать на собственные строки запросов и маршруты, модуль информации о налоговых посылках, который аналогично имеет свой собственный вид (ы), режим поиска документов, который отображает один и несколько документов...вы уловили идею.Важной частью является то, что каждый модуль действительно автономен.Если пользователь выполняет поиск налоговой записи по имени, он может увидеть 10 результатов ("ДЖОН ДОУ" владеет несколькими объектами недвижимости).Каждый результат имеет ссылку "Сопоставить его", потому что платформа веб-приложения знает, что доступен модуль map.Ссылка "Сопоставить это" отправляет правильный запрос следующим образом http://myapp.com/taxparcel/map/123443.Контроллер модуля карты отвечает на внешний запрос, увеличивая масштаб карты и выделяя налоговый участок.

Ключ ко всему этому потоку заключается в том, что и то, и другое модули tax и mapping находятся на одной веб-странице.

Итак, как это вписывается в рамки ASP.NET MVC?Частичные?Дополнительные виды?Несколько представлений для одного контроллера?Если я просто пропускаю очевидную часть документации, то не стесняйтесь публично критиковать меня и включать ссылку.В остальном я широко открыт для предложений.

Это было полезно?

Решение

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

public ActionResult Search(string text)
{
   var model = seachService.Search(text)
   // here either:
   // 1. model contains .Modules collection and is populated by the service, or
   // 2. controller does
   var viewmodel = new SearchViewModel(model, modulesService.GetModulesFor(model));
   // i.e. it adds modules-specific information to the view data
   return View(model);
}

Теперь данные, относящиеся к конкретным модулям, преобразуются SearchViewModel во что-то, что View может использовать:

public interface IModuleSpecificViewPart
{
  public IList<string> GetAdditionalLinksForUser();
  public void RenderAdditionalInfo(Response response);
}

и ваш взгляд делает

<%= Model.Results[i] %>
<% foreach (var module in Model.ModuleSpecific) { %> 
<a href="<%=module.AdditionalLink%>">More</a> 
<% module.RenderAdditionalInfo(Response); %>
<% } %>

Или модель представления модуля может предоставлять частичное имя представления и т.д.Обратите внимание, что это модули.GetModulesFor() и SearchViewModel, которые выполняют эту работу - например, SearchViewModel может выполнять IoC.GetInstanceByType("ModuleViewModel" + переданный модуль.GetType().Name) - автоматический выбор конкретного класса модели представления модуля.

В этом и заключается идея.Возможно, я совершенно неправильно понимаю ваш вопрос - извините, если это так.

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

Другие советы

Я думаю, что ответ queen3 больше подходит для вашей конкретной проблемы, но я подумал, что в любом случае опубликую свои идеи по общему вопросу.

Я подумываю о том, чтобы сделать что-то подобное, используя методы, обсуждаемые в Мэтью Эббот's запись в блоге.Используя MEF, вы можете просто поместить новую библиотеку dll на свой портал, чтобы активировать модуль.

Наличие нескольких модулей на одной странице немного сложнее. RenderPartial могло бы сработать, но обычно это предназначено для добавления кода, который работает с той же моделью представления. RenderAction с другой стороны, использует свой собственный контроллер и модель.Обычно я бы не предпочел использовать RenderAction в любом другом сценарии, потому что это нарушает или, по крайней мере, свертывает шаблон MVC.Однако в этом случае он будет использоваться только на одной странице, которая отвечает за размещение нескольких модулей.Все ваши плагины могут быть обычными представлениями MVC, контроллерами и моделями.

Подробности о RenderAction можно найти здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top