2010-08-08 132 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。您不必爲其創建新的視圖模型類,只需將該集合作爲屬性包含在該類中即可。

看看你在評論的兩行中寫了什麼,然後想一想。

相關問題