如何实现选项卡控件,其中每个选项卡是一个通用的分页实体?

时间:2010-08-05 21:15:54

标签: c# asp.net-mvc generics tabcontrol viewmodel

背景
我正在尝试实现一个制表符控件。选项卡如下:

| 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; }
}

和Paging的签名是:

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 :(得分:0)

当我们在我们的一个MVC站点中实现选项卡(JQuery UI)时,我们为每个选项卡使用了单独的操作方法。在我们的例子中,选项卡不同,我们必须为每个选项卡分别设置partialView。

即使您可以使用相同的partialView,我认为通过为每个选项卡使用不同的方法(考虑可读性,问题跟踪,未来的增强功能),您将更少地头痛和维护。保持一个动作,想想如果是......如果公司需要自己的部分视图,如果资金需要一些不同的搜索标准,如果我们必须添加更多标签怎么办?当然,您可以在当前设置中解决所有这些问题,但在什么时候它会变得无法维护。使用不同的行动方法恕我直言,能够解决所有这些问题和更多问题会更好。