.NET MVC3 + Razor Multiple RenderView/RenderAction

.NET MVC3 + Razor Multiple RenderView/RenderAction

本文关键字:RenderView RenderAction Multiple Razor MVC3 NET      更新时间:2023-09-26

我和我的伙伴决定使用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发送给一个动作。

是的,有几种方法可以做到这一点。两个简单的:

  1. 根据请求内容将初始方法重定向到适当的控制器方法。如果您的参数都是通过GET传递的,那么这是一种快速而简单的方法。缺点是POST数据没有重定向,所以如果你调用[HttpPost]方法,它将不起作用。

  2. 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到它。该方法在内部可以根据传入的模型数据返回不同的数据。

对于建立模型,您也有一些选项:

  1. 将每个单独模型上的每个字段合并成一个大模型,并填写您需要的内容

  2. 用单个模型作为父容器的子属性创建一个层次模型。MVC非常擅长将子对象(和数组)转换为绑定字段,然后再转换回来。因此,名称为"Case1Data"的HTML输入。Name"将被绑定到模型类的Case1Data字段的Name字段。