【问题标题】:KnockoutMVC Foreach Lambda filter (or any filter)KnockoutMVC Foreach Lambda 过滤器(或任何过滤器)
【发布时间】: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


【解决方案1】:

您不能在 razor 中使用 C# 代码来修改您的视图模型。要绑定某些东西,它需要 viewmodel 中的表示。如果您想过滤完整列表,viewmodel 上的 computed 属性应该可以解决问题。

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

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2022-01-08
    • 1970-01-01
    • 2014-07-06
    • 2010-11-17
    相关资源
    最近更新 更多