.NET MVC3 + Razor Multiple RenderView/RenderAction
.NET MVC3 + Razor Multiple RenderView/RenderAction
我和我的伙伴决定使用Razor在。net MVC中创建一个应用程序,因为我们之前都没有使用过。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一个模型到控制器,并有结果返回基于提交上下文不同的视图,还是我过度思考这个问题?
最干净的方法是为每个场景创建一个操作/模型/视图。您可以让一个操作返回不同的视图/模型。视图知道它需要在哪里发布它支持的模型。
当然你可以做更复杂的事情,比如把你的模型构建成一个javascript对象,然后把JSON发送给一个动作。
是的,有几种方法可以做到这一点。两个简单的:
-
根据请求内容将初始方法重定向到适当的控制器方法。如果您的参数都是通过GET传递的,那么这是一种快速而简单的方法。缺点是POST数据没有重定向,所以如果你调用
[HttpPost]
方法,它将不起作用。 -
MVC控制器基类上的
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); }
你需要想出一个单一的控制器方法,可以作为"调度"方法,你的所有表单的post到它。该方法在内部可以根据传入的模型数据返回不同的数据。
对于建立模型,您也有一些选项:
将每个单独模型上的每个字段合并成一个大模型,并填写您需要的内容
用单个模型作为父容器的子属性创建一个层次模型。MVC非常擅长将子对象(和数组)转换为绑定字段,然后再转换回来。因此,名称为"Case1Data"的HTML输入。Name"将被绑定到模型类的Case1Data字段的Name字段。