Страница MVC, которая отображает несколько связанных ViewModels, обновляющихся с помощью ajax

У меня есть несколько простых страниц управления списками, каждая из которых строго типизирована по следующей ViewModel.

public class ListManagementIndexViewModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

У меня есть представления для категории, приоритета, статуса и несколько других раскрывающихся списков, есть некоторая конфигурация AutoMapper, которая гарантирует, что свойство Name привязано к любой модели домена, которая может быть для объекта. Идея состоит в том, что системные администраторы могут управлять содержимым этих списков (создавать новые, редактировать существующие и удалять). Это дает мне представление индекса для каждого из них:

Управление списком приоритетов

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

Также я не понимаю, как обращаться с контроллером (ами). Как обстоят дела; с PriorityController у меня есть следующий индекс ActionResult

public ActionResult Index(string searchString, string currentFilter, int? page)
    {
        if (Request.HttpMethod == "GET")
            searchString = currentFilter;

        ViewBag.CurrentFilter = searchString;
        int pageNumber = page ?? 1;

        var query = Session.QueryOver<Priority>();

        if (!string.IsNullOrWhiteSpace(searchString))
            query.WhereRestrictionOn(p => p.PriorityName)
                 .IsInsensitiveLike(String.Format("%{0}%", searchString));

        var result = query.OrderBy(p => p.PriorityName).Asc.List();

        var viewModel = AutoMapper.Mapper.Map<IEnumerable<Priority>, 
                          IEnumerable<ListManagementIndexViewModel>>(result)
                                  .ToPagedList(pageNumber, PageSize);

        return View(viewModel);
    }

Хотя я мог бы переместить это на страницу управления одним списком 'Master', мне также нужно было бы сделать то же самое для других типов списков, но тогда что нужно было бы моей ViewModel Похоже, в настоящее время есть 5 списков для управления, поэтому у меня есть 5 контроллеров, делающих одно и то же, только типы различаются. Если бы я поместил все это на 1 страницу с одним представлением 'Master', мне бы каким-то образом нужно было поместить все 5 коллекций PagedList в 1 ViewModel, а затем в одиночную страницу 'Master'. версии передать данные соответствующему коду бритвы Partials?

Кроме того, как мне обрабатывать другие действия контроллера (редактировать, создавать и удалять)?

Обновление
Думая о моих ногах - если бы унифицированная/единая страница представления ViewModel была:

public class ListManagementIndexViewModel
{
    public Dictionary<string, IPagedList<T>> ManagementLists { get; set; }
}

и SinglePageController были

public ActionResult Index(string searchString, string currentFilter, int? page)
{
    var priorities = GetPriorities(searchString, currentFilter, page);
    var categories = GetCategories(searchString, currentFilter, page);

    Dictionary<string, IPagedList> viewModel
       = new Dictionary<string, IPagedList<T>>();

    viewModel.Add("Priorities", priorities);
    viewModel.Add("Categories", categories);
    return View(viewModel);
}

Я мог бы перенести существующую логику в частный метод

private IPagedList<Priority> GetPriorities(string searchString, 
                                           string currentFilter, int? page) 
{
    if (Request.HttpMethod == "GET")
        searchString = currentFilter;

    ViewBag.CurrentFilter = searchString;
    int pageNumber = page ?? 1;

    var query = Session.QueryOver<Priority>();

    if (!string.IsNullOrWhiteSpace(searchString))
        query.WhereRestrictionOn(p => p.PriorityName)
             .IsInsensitiveLike(String.Format("%{0}%", searchString));

    var result = query.OrderBy(p => p.PriorityName).Asc.List();

    var priorities = AutoMapper.Mapper.Map<IEnumerable<Priority>, 
                          IEnumerable<ListManagementIndexViewModel>>(result)
                                  .ToPagedList(pageNumber, PageSize);

    return priorities;
}

Затем в моем представлении модель будет содержать ManagementLists коллекций, и я смогу foreach результаты в html-таблицы, как я сейчас делаю, но на отдельных страницах.

Однако просмотр результатов по страницам приведет к разбиению по страницам всех таблиц списков, а не только таблицы Priorities. Как мне сделать каждое обновление с помощью Ajax, чтобы подкачка в одной таблице обновляла только список в этой одной таблице? Если бы я снова включил поиск, который в настоящее время находится в методе ActionResult, но не реализован в пользовательском интерфейсе, мне также потребовалось бы обновить только таблицу Priorities. Например, если я ввел «Высокий» в поиске «Приоритет», я бы хотел только запросить таблицу «Приоритет» и обновить ее, а не выполнять 5 запросов к базе данных для поиска «Высокий» в категории или любом другом списке.


person Simon Martin    schedule 27.03.2013    source источник
comment
Я думаю, что под главной страницей вы подразумеваете макет. в этом случае используйте частичные действия с дочерними действиями   -  person Dave Alperovich    schedule 28.03.2013
comment
В настоящее время у меня есть 5 представлений индекса (по 1 для каждого типа), но я бы хотел, чтобы все управление списками выполнялось на одной странице, пользовательский интерфейс был бы более плавным. Итак, на моем скриншоте плавают еще 4 стола справа от уже существующего. Это не мастер-страница как таковая (в смысле этого слова в ASP.NET).   -  person Simon Martin    schedule 28.03.2013


Ответы (1)


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

Было бы более организованно разместить 5 списков на одной странице, чтобы они все были в одной модели и централизованно управлялись одним контроллером/моделью.

person mattytommo    schedule 27.03.2013
comment
У меня нет намерения когда-либо использовать их снова, поэтому частичное не похоже на правильный подход. Но вы точно знаете, чего я хочу добиться, 5 списков на одной странице (которые я назвал мастером). - person Simon Martin; 28.03.2013
comment
@SimonMartin Не используйте терминологию мастер, хотя люди считают, что это фактический мастер (файл _Layout.cshtml, потому что с технической точки зрения это MVC-эквивалент файла главную страницу). - person mattytommo; 28.03.2013
comment
Я обновил вопрос и удалил ссылки на основной и частичный. - person Simon Martin; 29.03.2013