ASP.NET MVC剃刀视图,从原始模型绑定发布到不同的模型?

时间:2015-05-23 19:14:05

标签: c# asp.net-mvc razor asp.net-mvc-5 model-binding

我在项目中有一个组控制器和视图,其中模型绑定是GroupViewModel。但是组页面很复杂,用户可以进行讨论主题。在此组视图页面上,我有表单,允许用户发布主题/回复。用于这些表单的模型可以是TopicViewModel或ReplyViewModel,但原始模型绑定仅适用于GroupViewModel。它在cshtml页面的开头声明:

@model MyProject.ViewModels.GroupBrowseViewModel

所以我想知道,是否可以将表单从顶部声明的表单绑定到不同的视图模型?如果是这样,如何实现这一目标?

2 个答案:

答案 0 :(得分:5)

模型绑定实际上与剃刀视图中使用的模型无关。至少在技术上不是。

首先要明白的是,这里没有魔力。这是直接的HTTP发布值,如果您不了解HTTP发布的工作原理,我建议您阅读它。它只是一系列名称/值对。

发布时,路由框架会查看选定的操作方法以及方法所采用的参数,然后创建这些参数的新实例,并尝试将它们与发布值中的类似命名值进行匹配。

因此,换句话说,您在页面上使用的模型与发布的控制器操作中使用的模型之间没有直接连接。这一切都基于命名约定。此命名约定由您在页面上声明的模型“帮助”,并且Html帮助程序创建表单字段,其名称与模型条目匹配,以便模型绑定器可以更轻松地计算出这些。

所以,这意味着,为了使用不同的模型发布到不同的操作,您需要的只是表单中具有新模型所期望的名称的字段。

这可以通过多种方式完成,从手动定义这些字段,到使用部分视图,在该视图中,您要将要发布的模型实例作为模型参数传递。

答案 1 :(得分:0)

您可以在同一视图中使用2个局部视图,并从控制器切换到哪个显示。

或者你可以创建一个新的ViewModel,这个视图模型将包含对你的两个视图的引用,并且在基于你的逻辑的视图html中,你可以从任何子ViewModel切换读取。