如何使这两个几乎相同的代码块可重用?

时间:2010-08-08 13:43:57

标签: c# asp.net-mvc partial-views abstraction code-reuse

我需要建议我需要做些什么才能使以下两个代码块可重用。我必须制作另一张资金表,而我正在这样做,我想创建FundsTable.ascx局部视图,所有需要显示基金表的视图都可以使用。

// Inherits="System.Web.Mvc.ViewPage<CompanyViewModel> // this is a company
<%foreach (var fund in Model.PageFunds){%>

    <% foreach (var shareClass in fund.ShareClasses) {%>

        <tr class="shareclass">
            <td>
                // displays an image if the ViewModel's Company is not unlisted
                <%= Html.TearsheetImage((Model.Company.ListingType != ListingType.UNLISTED))%>
            </td>
        </tr>
<% } }%>

// Inherits="System.Web.Mvc.ViewPage<GroupViewModel> // this is a group of companies
<%foreach (var fund in Model.PageFunds){%>

    <% foreach (var shareClass in fund.ShareClasses) {%>

        <tr class="shareclass">
            <td>
                // displays an image if any Company in the ViewModel's 
                // List<Company> is not unlisted
                <%= Html.TearsheetImage(
                        (Model.Companies.WithCompanyId(fund.Company.Id) != ListingType.UNLISTED))%>
            </td>
        </tr>
<% } }%>

我想我需要在某个地方抽象差异,但我不知道该把它放在哪里。我应该遵循这里的任何经验法则吗?

CompanyViewModel&amp; GroupViewModel实现一个界面来决定该项是否为Unlisted?另外,我的FundTable.ascx应该是什么类型的?我在想CompanyViewModel&amp; GroupViewModel可以扩展FundViewModel(或其他内容),我可以将FundTable设为ViewUserControl<FundViewModel>,但我认为这不会起作用,因为确定是否需要显示图像所需的功能需要来自CompanyViewModel&amp; GroupViewModel独立。

另外,我越想到这一点,我就越会自我欺骗!任何想法或建议? Thankss

2 个答案:

答案 0 :(得分:3)

如果我正确阅读此代码,则代码的不同之处仅在于您决定是否显示图像。

如果这是正确的,这是进行一些功能性编程的理想场所!

为.ascx创建一个视图模型。我们称之为FundsTable。

它将有两个属性:

Func<PageFund,bool> ShowImage {get;set;}
IEnumerable PageFund Funds {get;set;}

使您的FundsTable.ascx强烈输入此对象。

现在您可以传递关于是否显示的逻辑:

FundsTable ft = new FundsTable();
ft.ShowImage = f => f.SomeCombinationOfLogic == SomeOtherThing; //<-- Your function can be anything that returns a bool

现在你可以做到:

<% foreach (var shareClass in fund.ShareClasses) {%>

    <tr class="shareclass">
        <td>
            // displays an image if any Company in the ViewModel's 
            // List<Company> is not unlisted
           <% if(Model.ShowImage(fund)) {%>
               <%= Html.TearsheetImage(fund)%>
           <% } %>
        </td>
    </tr>

现在,我很难说出这些类如何相互关联,所以你可能不得不改变类型和逻辑,但这样的方法应该有效。在为表格设置视图模型时,只需传入将决定是否显示图像的函数。如果Tearsheet查找需要这种复杂性,请添加另一个Func属性。

答案 1 :(得分:0)

对我来说,像这样的问题的根源在于公司视图模型和公司组视图模型本质上是相同的(或应该是),并且您可能在某种程度上,无意中,设法从中创建了两个不同的视图模型。通常的逻辑是,一组公司应该只是List<CompanyViewModel>。您可以将列表发送到视图或viewusercontrol。您不必为它创建一个新的viewmodel类,只是将该集合包含在该类中的属性中。

查看你在评论的两行中写的内容并考虑一下。