2013-07-31 48 views
0

我已經能夠創建循環頁面列表的顯示。這將顯示數據庫表中的所有頁面,如下所示。KnockoutMVC Foreach Lambda過濾器(或任何過濾器)

@using (var page = ko.Foreach(m => m.PageList)) 
{ 
    @page.Html.TextBox(p => p.PageErrorMessage) 
    @page.Html.TextBox(p => p.PageSuccessMessage) 
    @page.Html.TextBox(p => p.Title) 
    @page.Html.TextBox(p => p.Content) 
} 

我希望能夠過濾由Foreach上的lambda表達式顯示的內容。目前,返回IEnumerable類型,即使在最後使用ToList()時,以下情況也不起作用。

//Note: I have tried .Where pl.Title == "string" with the same results 
@using (var page = ko.Foreach(m => m.PageList.Where(pl => pl.Title.Contains("Page01"))) 
{ 
    @page.Html.TextBox(p => p.PageErrorMessage) 
    @page.Html.TextBox(p => p.PageSuccessMessage) 
    @page.Html.TextBox(p => p.Title) 
    @page.Html.TextBox(p => p.Content) 
} 

我可以得到我想要的結果,但這樣做看起來很麻煩。如果我使用相同的支票爲每個字段添加可見的支票,我只會看到我想要的字段。

//Note: p.Title.Contains("string") does not work for me in the Visible here 
@using (var page = ko.Foreach(m => m.PageList)) 
{ 
    @page.Html.TextBox(p => p.PageErrorMessage).Visible(p => p.Title == "Page01!") 
    @page.Html.TextBox(p => p.PageSuccessMessage).Visible(p => p.Title == "Page01!") 
    @page.Html.TextBox(p => p.Title).Visible(p => p.Title == "Page01!") 
    @page.Html.TextBox(p => p.Content).Visible(p => p.Title == "Page01!") 
} 

是否有更好的方式來使用foreach篩選列表或目前設計爲總是返回全套?

+0

對knockout-mvc不太熟悉,但我確信你必須在viewmodel上引用一個計算列表。您不能在頁面上使用C#lamba,因爲它需要轉換爲javascript。 – Tyrsius

+0

你對轉換爲js的轉換是正確的,但這並不意味着它不應該有某種過濾器。任何類型的過濾器都可以接受,它不需要是lambda。在我看來,如果你有一個數據庫中的項目,你並不總是想顯示它們全部。也許有些東西是不活動的,或者甚至是使用聯繫人編輯器,你可能只想一次拉出5個。 – JabberwockyDecompiler

+1

這仍然需要是視圖模型中的邏輯,表示爲一個計算列表。 – Tyrsius

回答

1

您不能在剃鬚刀中使用C#代碼來修改您的視圖模型。爲了綁定某些東西,它需要在視圖模型中進行表示。如果你想過濾完整的列表,視圖模型上的computed屬性應該可以做到。

[Computed] 
public List<Page> FilteredList 
{ 
    get { return PageList.Where(pl => pl.Title.Contains("Page01")); } 
}