Как реализовать элемент управления вкладками, где каждая вкладка является универсальной страничной сущностью? - PullRequest
0 голосов
/ 06 августа 2010

Фон:
Я пытаюсь реализовать вкладку управления.Вкладки имеют следующий вид:

| Funds | Companies | Groups |

и реализованы следующим образом:

<ul class="ActionControl">

    <li>
        <%=Html.ActionLink(string.Format("Funds ({0})", Model.Summary.FundCount)
            , "ResultsList", new {selectedTab = "Funds"} ) %>
    </li>
    // more tabs removed for brevity, one <li> for each
</ul>

Каждая вкладка представляет собой ссылку на метод действия, который определяется как:

public PartialViewResult ResultsList(SearchViewModel search)
{
    var result = new SearchViewModel
    {

        Summary = _entitySearchService.GetSearchDataSummary(search.SearchExpression),
        PagedFunds = _fundService.GetPagedEntitiesByName<Fund>(10, search.SearchExpression),
        PagedCompanies = _companyService.GetPagedEntitiesByName<Company>(10, search.SearchExpression),
        PagedGroups = _groupService.GetPagedEntitiesByName<CompanyGroupInfo>(10, search.SearchExpression)
    };
}

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

Кроме того, это представляет проблему в частичном представлении, потому что мне приходится различать вкладки, чтобы определить, какой из них я должен заполнить таблицу.В настоящее время так я бы заполнил панель результатов, если бы вы щелкнули по вкладке Фонды:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SearchViewModel>" %>

<% Html.RenderPartial("Tabs"); %>

<table>

    <% foreach (var item in Model.PagedFunds) {%>

        <tr>
            <td><%= item.Name %></td>
        </tr>

    <% }%>

</table>

Для справки это SearchViewModel:

public class SearchViewModel
{
    public string SearchExpression { get; set; }
    public string SelectedTab { get; set; }

    public SearchDataSummary Summary { get; set; }

    public Paging<Fund> PagedFunds { get; set; }
    public Paging<Company> PagedCompanies { get; set; }
    public Paging<CompanyGroupInfo> PagedGroups { get; set; }
}

и подпись для подкачки:

public class Paging<T> : List<T> // contains functionality to manage paging and act like a List<T>

Вопрос:
Как мне лучше всего подойти к этой проблеме?

Должен ли я иметь отдельные методы действий для каждой вкладки?Таким образом, нажатие Funds приводит к

public PartialViewResult Funds(SearchViewModel search)

и возвращает ViewUserControl<Paging<Fund>>

, а нажатие Companies приводит к

public PartialViewResult Companies(SearchViewModel search)

и возвращает ViewUserControl<Paging<Company>>

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

1 Ответ

0 голосов
/ 06 августа 2010

Когда мы внедрили вкладки (JQuery UI) на одном из наших сайтов MVC, мы пошли с отдельными методами действий для каждой вкладки. В нашем случае вкладки были достаточно разными, так что мы все равно должны были иметь отдельные частичные представления для каждой вкладки.

Даже если вы можете использовать один и тот же PartalView, я думаю, что у вас будет гораздо меньше головной боли и обслуживания, если использовать отдельные методы для каждой вкладки (удобочитаемость, отслеживание проблем, будущие улучшения). Сохраняя одно действие, подумайте о том, что если… Что если компаниям нужно свое частичное представление, что если фондам нужны другие критерии поиска, что если нам нужно добавить больше вкладок? Конечно, вы можете решить все это в текущей настройке, но в какой момент он становится не подлежащим ремонту. Быть способным решить все эти и другие проблемы будет лучше с различными методами действий IMHO.

...