【发布时间】:2013-08-01 15:43:02
【问题描述】:
我已经能够创建一个循环显示页面列表的显示。这将显示 DB 表中的所有页面,如下所示。
@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 来过滤列表,或者目前是否设计为始终返回完整集?
【问题讨论】:
-
对knockout-mvc不太熟悉,但我很确定你必须在视图模型上引用一个计算列表。您不能在页面上使用 C# Lamba,因为它需要转换为 javascript。
-
你是正确的关于转换为淘汰赛 js,但这并不意味着它不应该有某种过滤器。任何类型的过滤器都是可以接受的,它不需要是 lambda。在我看来,如果您在数据库中有项目,您并不总是希望将它们全部显示出来。也许有些东西是不活跃的,或者甚至使用联系人编辑器,您可能一次只想拉出 5 个。
-
这仍然需要是视图模型中的逻辑,表示为计算列表。
-
是的,这是有道理的。有时你只需要退后一步重新思考问题。把它作为答案,我会检查它。
标签: asp.net-mvc-4 knockout.js knockout-mvc