Asp.net mvc 4 敲除MVC Foreach Lambda过滤器(或任何过滤器)

Asp.net mvc 4 敲除MVC Foreach Lambda过滤器(或任何过滤器),asp.net-mvc-4,knockout.js,knockout-mvc,Asp.net Mvc 4,Knockout.js,Knockout Mvc,我已经能够创建一个循环页面列表的显示。这将显示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.

我已经能够创建一个循环页面列表的显示。这将显示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来过滤列表,或者这是当前设计的始终返回完整集合的方法?

您不能在razor中使用C代码来修改viewmodel。要绑定到某个对象,它需要在视图模型中进行表示。如果要过滤完整列表,则viewmodel上的
computed
属性应该可以实现这一功能

[Computed]
public List<Page> FilteredList
{
  get { return PageList.Where(pl => pl.Title.Contains("Page01")); }
}
[计算]
公共列表过滤器列表
{
获取{return PageList.Where(pl=>pl.Title.Contains(“Page01”);}
}

不太熟悉淘汰版mvc,但我非常确定您必须参考viewmodel上的计算列表。你不能在页面上使用C#lamba,因为它需要转换为javascript。你对转换为knockout js的看法是正确的,但这并不意味着它不应该有某种过滤器。任何类型的过滤器都是可以接受的,它不需要是lambda。在我看来,如果数据库中有项目,您可能并不总是希望全部显示它们。也许有些东西是非活动的,或者即使使用联系人编辑器,您也可能一次只想调出5个。这仍然需要是viewmodel中的逻辑,表示为计算列表。是的,这是有意义的。有时候,你不得不后退一步,重新思考事情。把它作为一个答案,我会检查它。