2010-08-08 90 views
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> 
<% } }%> 

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

如果两个CompanyViewModel & GroupViewModel实现一个接口,决定该项目是否不公开?另外,我的FundTable.ascx应该是什么类型?我想这两个CompanyViewModel & GroupViewModel可以延长FundViewModel(或某事),我可以做一个FundTable但ViewUserControl<FundViewModel>我不认为这会工作,因为所需的功能,以确定是否要显示的图像需要来自CompanyViewModel & GroupViewModel独立。

另外,我越想越想我的自我!任何想法或建议?谢谢

回答

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

+0

这看起来很有趣。我有点不确定如何实现它。我将不得不在组视图和公司视图中对RenderPartial进行指令,类似于: '<%= Html.RenderPartial(“FundTable”,Model)%>',但这必须以某种方式必须能够包括区分它们所需的逻辑。我怎么做? – DaveDev 2010-08-08 15:24:37

+0

就在您做RenderPartial之前,为FundTable创建模型并将其传入: '<%FundTable ft = new FundTable(){ShowImage = f => YourLogicHere,Funds = Model.PageFunds}; %><%= Html.RenderPartial(“FundTable”,ft)%>' – jwsample 2010-08-08 19:03:37

+0

谢谢你,这是做的。这正是我们在这个项目中需要的。我现在在两个地方使用FundsTable,第三个将在明天实施。我也可以通过解决方案全面应用这种变化。我们将鞭策这个项目的形状! – DaveDev 2010-08-08 20:35:44

0

对我来说,这样的问题的根源在于,公司视图模型和公司视图模型本质上是相同的事情(或应该是),而且您可能无意中以某种方式设法使两种不同的视图模型脱离它。通常的逻辑是,一组公司应该只是一个List<CompanyViewModel>。您可以将List发送到视图或viewusercontrol。您不必为其创建新的视图模型类,只需将该集合作为属性包含在该类中即可。

看看你在评论的两行中写了什么,然后想一想。

相关问题