在 ASP.NET MVC3 中,应该如何呈现由多个模型支持的多个 PartialView?

2024-05-06

在 MVC3 Razor 中,如何创建具有多个表单的页面,以便每个表单都是使用自己的模型渲染的部分视图?

我们一直在尝试各种形式的调用 Html.RenderPartial(),传入部分视图名称以及我们通过 ViewBag 访问的模型实例,但我们尝试过的每种方法似乎都有严重的问题,并且因此,我们一定对理想世界中的运作方式存在根本性的误解。

我们发现了一些关于类似主题的回复(像这个 https://stackoverflow.com/questions/4419889/asp-net-mvc2-how-to-render-a-view-if-has-multiple-different-models)推荐一个“超级模型”,其中包含对我们的部分视图可能需要使用的每个子模型的引用,但我们找不到实际如何使用这些子模型数据的示例,例如当尝试编写 EditorTemplates 时。

Edit:让我澄清一下我的问题。我们能够渲染局部视图甚至动作(按照 Mark S. 的建议使用 RenderAction)。然而,我们的主要问题是,当这些表单提交回时,例如将模型的状态保存在该部分视图区域中,控制器似乎不知道我们正在引用哪个模型。我们应该如何调用控制器?

我们尝试了几种不同的方式来渲染这些部分视图。我们的第一次尝试是这样的:

@using (Html.BeginForm("SaveAccountInfo", null, FormMethod.Post, new { id = "section1-form" }))
{
    @Html.EditorForModel("AccountInfo", (OurModels.AccountInfo) ViewBag.account_info)
}

ViewBag.account_info 包含这一部分视图的模型数据。

我们也尝试过:

@{Html.RenderPartial("FormAccountInfo", (OurModels.AccountInfo) ViewBag.account_info);}

And now:

@{Html.RenderAction("FormAccountInfo", "Main", new { account_info = (OurModels.AccountInfo) ViewBag.account_info }); }

但是,无论我们使用哪种方法在页面上呈现这个表单,当提交该表单进行处理时,我们似乎无法通过模型访问任何提交的数据?我觉得我们正在做一些非常愚蠢的事情,但我们对 MVC 还很陌生。


不要陷入抽象的泥沼,从渲染页面到调用控制器方法,您仅在 HTML 和 HTTP 中工作。

如果您想使用不同的方法发回,有多种方法可以实现。您的页面上可以有多个 HTML 表单,也可以使用 jQuery 之类的东西来执行发布。哪个控制器操作接收您的帖子以及发回哪些数据由 HTML 页面上的表单及其内容决定。 MVC 处理程序将获取请求,并尝试将请求 URL 和内容绑定到与其匹配的可用操作之一。

要“回发模型”,您需要将数据发送回合适的操作,以便模型绑定程序可以读取它。这可以是 JSON 数据(如果您使用的是 MVC 3)或具有名称/值对的表单。但控制器对请求数据的页面及其创建方式一无所知。它甚至不知道请求是否是由页面发出的。

您可以自己尝试一下,制作一个普通的 HTML 页面,其中包含一个表单,该页面被设置为发布到您的 MVC 控制器之一的 URL。只要表单字段的名称与控制器操作参数上的属性名称匹配,MVC 就会绑定它并调用该操作。

如果您有复杂的视图,您可能会发现 jQuery post 是不错的选择,其中有一些客户端方法可以从页面收集数据并创建 JSON 对象以发回。使用该方法可以非常精确地控制发回的数据,而使用表单则有限制(例如重叠数据等)。

编辑-回复评论

下面是一个使用原始 HTML 的示例,仅用于展示一个非常简单的情况:

Public Class HomeController

    'Other action methods...

    <HttpPost()>
    Function SayHello(myName As String) As ActionResult
        Return Content("Hello " & myName)
    End Function

End Class

HTML 表单(我把它放在索引视图上,但它绝对可以放在任何地方)

<form action="/Home/SayHello" method="post">
    <input type="text" name="myName" />
    <input type="submit" />
</form>

我已将名称设置为<input>来匹配参数名称,这给MVC提供了帮助。虽然只有 1 个值被发回,但我可以将其命名为其他名称。但是如果我这样做:

<form action="/Home/SayHello" method="post">
    <input type="text" name="aName" />
    <input type="text" name="anotherName" />
    <input type="submit" />
</form>

...那么模型绑定器将不知道应该使用哪个值,并且您会得到未正确设置的值。

不过改成这样:

<form action="/Home/SayHello" method="post">
    <input type="text" name="myName" />
    <input type="text" name="anotherName" />
    <input type="submit" />
</form>

...模型绑定器现在能够使用名称来正确识别要使用的值和要忽略的值。

对于强类型操作:

Public Class HomeController

    <HttpPost()>
    Function SayHello(person As SimplePerson) As ActionResult
        Return Content("Hello " & person.FirstName)
    End Function

End Class

Public Class SimplePerson
    Public Property FirstName As String
    Public Property Surname As String
End Class

您需要具有与属性名称相对应的表单名称。我的 aName/anotherName 表单会发回正确的形状,但模型绑定器不会设置任何属性,因为它不知道什么是什么。然而,这会起作用:

<form action="/Home/SayHello" method="post">
    <input type="text" name="FirstName" />
    <input type="text" name="Surname" />
    <input type="submit" />
</form>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET MVC3 中,应该如何呈现由多个模型支持的多个 PartialView? 的相关文章

随机推荐

  • 在 CalDAV 中扩展重复事件

    假设 CalDAV 客户端非常愚蠢 深度嵌入 并且无法自行计算重复事件 然而 它能够放入 CalDAV 请求 假设 CalDAV 日历存储了生日 其中一个生日是 2000 年 12 月 31 日 现在客户希望收到 2005 05 05 到
  • 从用户定义的函数调用 sql

    SQL Server 2008 是否可以从用户定义函数中的变量执行 sql 或者使用存储过程是唯一的解决方案 我有一条sql语句保存在variabele中 mySqlStatement select from someTable 我想从用户
  • 如何从 URL 流式传输音频而不在设备上下载 mp3 文件

    如何在 Swift 中从 URL 流式传输音频而不在设备上下载 mp3 文件 我需要导入什么 我需要某些库吗 添加任何内容到 info plist 中吗 请评论你的代码 您可以使用 iOS AVPLayer 从 url 传输音频 var p
  • 非托管代码调用 vb.net 回调

    我正在将处理 COM 对象事件的 vb net 应用程序 可能用 VB6 编写 从框架 1 1 升级到 WPF 2 0 3 5 代码 为简洁起见 简化了对象名称 public class MyClass Private WithEvents
  • 如何在Python中打印出字母表中的第n个字母?

    ASCII 数学似乎在 Python 中不起作用 一 5 不起作用 如果没有字母数组 如何快速打印出字母表中的第 n 个字母 我天真的解决方案是这样的 letters A B C D E F G H I J K L M N O P Q R
  • 初始化父类时如何返回子类的新实例?

    给定一个类层次结构如下 class A def initialize param if param 1 then initialize and return instance of B else initialize and return
  • C# Elasticsearch NEST 无法转换 lambda 表达式

    我遇到了与此处描述的完全相同的问题 但未得到解答 ElasticSearch NEST 搜索 https stackoverflow com questions 24615676 elasticsearch nest search I us
  • 需要.Net 的公式解释器[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当我们回来时,查看寻呼机片段状态寻呼机适配器出现白屏?

    我已经使用 FragmentStatePagerAdapter 使用视图分页器来加载片段 当我第一次来时 它会工作 但如果我从寻呼机适配器重定向到其他片段并返回 它将显示空白屏幕 fragment community xml
  • 如何获取默认的iOS浏览器名称?

    Stack Overflow 应用程序检测到我越狱设置的默认浏览器 Chrome 的名称 我怎样才能在 Objective C 和 Swift 中实现同样的目标 只是名称 不是 ActivityView 代码 Example Update
  • 登录 python + mod_wsgi 应用程序

    我在 apache 服务器上部署了一个 python Flask 应用程序 这是我的abc conf file WSGIDaemonProcess voting app threads 5 WSGIScriptAlias election
  • 为什么 new()/delete() 比 malloc()/free() 慢?

    为什么new delete 比malloc free 慢 EDIT 感谢到目前为止的回答 如果您有new 和delete 的标准C 实现规范 请指出 谢谢 看一下这段C代码 struct data pd malloc sizeof stru
  • PostgreSQL 9.3 触发器函数插入带有参数化名称的表

    我正在尝试在 Postgres 中动态分区日志条目 我有 53 个子表 1 个代表每周的日志条目 并且希望使用触发器将 INSERT 路由到子表 我运行该函数INSERT INTO log5 VALUES NEW 并且它有效 我用以下命令运
  • 在 IISNode 上运行的 Azure Node.js 应用程序中未定义端口

    我有一个使用 IISNode 运行 Node js 应用程序的 Azure 应用服务 问题是process env PORT未定义 我读过 IISNode 使用一个叫做命名管道并且端口信息可能不容易读取 但就我而言 我只是未定义 我尝试部署
  • HK2 MethodInterceptor 与 Jersey 资源

    如何设置aopMethodInterceptor使用泽西岛资源 这是我尝试过的 如下this https hk2 java net 2 2 0 aop example html文档 第 1 步 拦截服务 public class MyInt
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 更改 WooCommerce 购物车和结帐页面中的“运输”文本:[重复]

    这个问题在这里已经有答案了 我正在将 WooCommerce 与 Storefront 主题一起使用 并且我正在尝试更改这个词 船运 在带有总计的购物篮页面上 我在这里找到了一些建议 https kriesi at support topi
  • iOS后台Location不发送http请求

    我的应用程序需要在后台跟踪用户位置 但无法发送 获取 请求 当应用程序到达前台时 http 请求会立即发送 我正在使用 RestKit 来处理所有网络请求 并且遵循本教程 http www mindsizzlers com 2011 07
  • Google Cloud Platform:将上传的 MP4 文件转换为 HLS 文件

    我正在构建一个平台 允许用户将一些视频文件 20 40 秒 从手机上传到服务器 所有这些上传目前都运行良好 文件通过nodejs云功能存储在谷歌存储桶中 现在我想创建一个 gcp 转码器作业 它将上传的 mp4 视频文件转换为 hls 视频
  • 在 ASP.NET MVC3 中,应该如何呈现由多个模型支持的多个 PartialView?

    在 MVC3 Razor 中 如何创建具有多个表单的页面 以便每个表单都是使用自己的模型渲染的部分视图 我们一直在尝试各种形式的调用 Html RenderPartial 传入部分视图名称以及我们通过 ViewBag 访问的模型实例 但我们