如何使这两个几乎相同的代码块可重复使用?(关于IT技术)

4

我需要建议,了解如何使以下两个代码块可重复使用。我必须生成另一个基金表,同时,我想创建一个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>
<% } }%>

我认为我需要在某个地方抽象出差异,但我不确定应该放在哪里。这里有什么经验法则吗?

是否应该让CompanyViewModelGroupViewModel都实现一个接口来决定项目是否未列出?此外,我的FundTable.ascx应该是什么类型?我想让CompanyViewModelGroupViewModel都扩展FundViewModel(或其他东西),然后我可以使FundTable成为一个ViewUserControl<FundViewModel>,但我认为这行不通,因为需要确定是否显示图像的功能需要分别来自CompanyViewModelGroupViewModel

另外,我越想越混乱!有任何想法或建议吗?谢谢

2个回答

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属性。


这看起来很有趣。但我有点不确定如何实现它。我需要在Group View和Company View上添加一个RenderPartial指令,类似于: <%= Html.RenderPartial("FundTable", Model) %>,但是这将需要包含区分它们所需的逻辑。我该怎么做呢? - DaveDev
在执行RenderPartial之前,创建FundTable的模型并将其传递进去:
<% FundTable ft = new FundTable() {ShowImage = f=> YourLogicHere, Funds = Model.PageFunds}; %> <%= Html.RenderPartial("FundTable", ft) %>
- jwsample
谢谢,这就是我们在这个项目中所需要的。我现在在两个地方使用FundsTable,并计划明天实施第三个。我还可以在整个解决方案中应用这些修改。我们会让这个项目变得更好! - DaveDev

0
对我来说,这样的问题根源在于“公司视图模型”和“公司组视图模型”基本上是相同的东西(或应该是),你不知不觉中将其制成了两个不同的视图模型。常见的逻辑是,“公司组”应该只是一个List<CompanyViewModel>。您可以将List发送到视图或视图用户控件中。您不必为此发明一个新的视图模型类,只需将集合作为该类的属性包含即可。
请查看您在注释的两行代码中编写的内容并思考一下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接