我的合作伙伴和我决定使用Razor在.NET MVC3中创建一个应用程序,因为我们之前都没有使用.NET MVC或Razor。 我有一个页面,其中有一个“用户仪表板”,我已经添加了几个RenderView / RenderAction部分,通常带有表单。所有这些表单都在加载时转换为jQuery JSON表单:
$('#main').delegate("form:has(.siteFormField)", "submit", function () {/*form and submit logic here*/})
并接收部分视图,这些视图通常是表单的更新版本以及状态消息。
我有一组表单,其中一个输入影响另一个的内容(点击'注册'按钮,项目移动到另一个列表)。我在一个局部视图中渲染两个表单,它使用RenderAction调用控制器包含在仪表板中,该控制器返回两个表单都已更新的视图。但是,带按钮的表单调用不同的控制器,通常只返回更新的表单和状态消息。 通常我会用JavaScript完成所有这些,调用方法并解析结果以确定如何转换DOM,但我们试图将其作为MVC + Razor尽可能地使用。是否有一种干净的方法将模型POST到控制器并使结果根据提交上下文返回不同的视图,或者我是否在考虑这个问题?
答案 0 :(得分:0)
最干净的方法是为每个场景创建一个动作/模型/视图。 您可以让一个操作返回不同的视图/模型。该视图知道发布它支持的模型所需的位置。
当然,您可以执行更复杂的操作,例如将模型构建为javascript对象并将JSON发布到操作中。
答案 1 :(得分:0)
是的,有几种方法可以实现这一目标。两个直接的:
根据请求内容将初始方法重定向到适当的控制器方法。如果您的参数都通过GET传递,这是一种快速简便的方法。缺点是POST数据没有被重定向,所以你调用[HttpPost]
方法它不起作用。
MVC Controller基类上的View
方法需要大量重载。其中一个采用视图名称,允许您执行以下操作:
switch ( foo )
{
case 1:
return this.View("View1", InputModel.Case1Data);
case 2:
return this.View("View2", InputModel.Case2Data);
default:
return this.View(InputModel.FallbackData);
}
编辑:我想我可能还没有完全理解你的问题,所以要澄清:
您需要提供一个可以充当“调度”方法的单个控制器方法,并且所有表单都会发布到该方法。该方法在内部可以根据您传入的模型数据返回不同的数据。
为了处理模型,你也有一些选择:
制作一个大型模型,每个模型上的每个字段的并集,并填写您需要的内容。
使用单个模型作为父容器的子属性创建一个层次模型。 MVC非常适合将子对象(和数组)转换为绑定字段,然后再返回。因此,名为“Case1Data.Name”的HTML输入将绑定到模型类的Case1Data字段的Name字段中。