使用Razor视图模型和@functions的Knockout风格动态页面?

时间:2013-02-13 16:32:00

标签: c# web-applications asp.net-mvc-4 razor-2

我正在构建一个页面,用户可以通过构建一组搜索条件来查询一组数据,类似于Visual Studio TFS插件允许您搜索工作项的方式:条件表,您在哪里可以继续添加行。您为连接条件选择“和”或“或”,然后选择一个字段,输入一个值,并选择是否需要与之匹配或不匹配的事物:

1. show items where [Field] [is|is not] [value]
2.         [and|or] [Field] [is|is not] [value]
3.         [and|or] [Field] [is|is not] [value]
etc...

现在,我正在研究如何构建这个,我有一个想法。在过去,我使用过Knockout,但这需要我在Javascript中使用模型来映射数据,这在我已经在服务器端代码中使用C#中的模型时似乎是多余的。当然,我可以使用Razor代码来查看强类型视图中模型的一部分标准列表,但是我找不到添加到此列表中的整洁方法。

C#中的模型结构(大致)是这样的:

  • Field
    • 字段名称
    • 的选项列表
    • 是/不是选项的布尔值。
  • Criterion
    • Field
    • 选定值
    • 组合类型(和/或)
  • Query
    • Criterion的列表(看起来很奇怪,不说标准)
    • 开始和结束日期
    • 用户的访问级别
    • 查看字段和排序选项
  • QueryViewModel
    • Query
    • 用于填充视图选项选择区域的各种列表
    • 页面上其他(不相关)显示的一些元数据

在Knockout中,我会在“添加搜索条件”按钮上添加一个点击方法,以便将新条目添加到条件列表中。我可以使用Razor功能块(@functions { ... })来获得类似的结果吗?我已经尝试了一些东西,但我发现viewmodel似乎不在范围内,或者没有办法更新页面以显示viewmodel的新内容(尽管我正在尝试一些涉及将新更新的视图模型传递给部分视图,这可能会以某种方式工作)。可以这样做,还是我需要深呼吸并回到Javascript?

1 个答案:

答案 0 :(得分:1)

您可以使用标准MVC控制器和JSONResult或使用MVC 4中的Web API将C#对象序列化/反序列化为JSON。这意味着您无需在javascript中显式重新定义c#对象。

在浏览器中,您可以使用knockout映射插件在需要时将json属性设置为knockout observable。

这通常比从服务器动态加载和呈现html更简洁,更健壮(如果那是你的建议 - 从你的帖子中没有100%清除)。