MVC4:嵌套部分视图丢失模型数据

2024-01-16

在 MVC4 项目中,我使用部分视图,该视图使用 ViewModel 并具有 GET 表单。在控制器操作中,我期望 ViewModel 对象包含一些数据。 当将此部分放置在普通(.cshtml)视图上时,我通过控制器操作中的预期 ViewModel 对象接收数据。但是,当这个部分放在另一个局部视图,由于某种原因,控制器操作中的 ViewModel 对象为空。当我逐步创建 HttpGet 表单时,传入的模型不为空,但当调用 GET 控制器操作时,模型为空。

有人知道这是什么原因吗?这是我不知道的 MVC 行为吗?谢谢!

部分:

@model ViewModel
    @if (Model != null)
    {
        using (Html.BeginForm("DoSomething", "Home", FormMethod.Get))
        { 
            @Html.HiddenFor(m => m.Object)            
            <input id="btnSend" type="submit"> 
        }
    }

其他部分:

@using OtherViewModel.ViewModel
@Html.Partial("The Partial", Model.ViewModel, ViewData)

风景:

@Html.Partial("_TheOtherPartial", Model.OtherViewModel, new ViewDataDictionary(ViewData) {
                TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "prefix" }
    })

控制器

[HttpGet]
[AllowAnonymous]
public ActionResult DoSomething(ViewModel data)
{
}

这里您应该考虑两件事。第一个是尽量不要将表单放入部分视图中。如果这样做,您可能会得到浏览器不支持的嵌套表单,因为这不是有效的 HTML http://www.w3.org/TR/html401/interact/forms.html#h-17.3:

<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->

-(FORM)构造不允许嵌套形式。

第二件事是代替部分观点我建议你使用编辑器模板. 看看这里 https://stackoverflow.com/questions/5197038/complex-models-and-partial-views-model-binding-issue-in-asp-net-mvc-3如何使用它们。接下来,正如我之前所说,尝试将表单保留在编辑器模板之外 - 在主视图中使用表单,并让编辑器模板呈现页面的不同部分。它将减少混乱并产生更清晰的代码。

在您的具体示例中,它可能如下所示:

主要观点:

@model MainModel
@using (Html.BeginForm("YourAction", "YourController"))
{ 
    @Html.EditorFor(m => m.OtherViewModel)
    <input id="btnSend" type="submit"> 
}

OtherViewModel.cshtml编辑器模板:

@model OtherViewModel
@Html.EditorFor(m => m.ViewModel)

ViewModel.cshtml编辑器模板:

@model ViewModel
@Html.EditorFor(m => m.Object)

主控制器:

public ActionResult YourAction(MainModel data)
{
    ...

Models:

public class MainModel
{
    public MainModel() { OtherViewModel = new OtherViewModel(); }
    public OtherViewModel OtherViewModel { get; set; }        
}

public class OtherViewModel
{
    public OtherViewModel() { ViewModel = new ViewModel(); }
    public ViewModel ViewModel { get; set; }
}

public class ViewModel
{
    public string Object { get; set; }
}

请注意,模板名称反映了模型类型名称。接下来,将您的模板放在此下~/Views/Shared/EditorTemplates/或这个~/Views/YourController/EditorTemplates/目录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC4:嵌套部分视图丢失模型数据 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • C# 中附加/分离事件处理程序的不同方式有什么区别

    我的问题有两个部分 首先 我们可以通过以下两种方式附加事件处理程序 myObject MyEvent new EventHandler MyHandler myObject MyEvent MyHandler 据我了解 这两者是等价的 在第
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 将自定义参数传递给 ValidationAttribute

    我构建了一个自定义 ValidationAttribute 以便可以验证系统中的唯一电子邮件地址 但是 我想以某种方式传递自定义参数 以便为我的验证添加更多逻辑 public class UniqueEmailAttribute Valid
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 在 ReactJS 中显示/隐藏组件

    我们现在在使用 React 的过程中遇到了一些问题 但是它kinda归结为我们如何使用 React 的一部分 我们应该如何显示 隐藏子组件 这就是我们编码的方式 这只是我们组件的片段 click function if add here i
  • 如何在 Python 3 中使用 urllib.request 下载文件?

    所以 我正在搞乱urllib request在Python 3中 我想知道如何将获取互联网文件的结果写入本地计算机上的文件 我试过这个 g urllib request urlopen http media mcw cursecdn com
  • 如何为 reStructuredText、Sphinx、ReadTheDocs 等设置自定义样式?

    我想扩展使用的主题Sphinx and 阅读文档与我自己的自定义样式 为了让我的更改得以保留 最好的方法是什么 编辑 截至 2021 年 以下答案已过时 请使用html css files 在你的conf py而不是使用版本 1 8 之后的
  • 如何为 wxWidgets OpenGL 程序启用多重采样?

    多重采样 http en wikipedia org wiki Multisample anti aliasing是一种申请方式全屏抗锯齿 FSAA 在 3D 应用中 我需要在我的 OpenGL 程序中使用多重采样 该程序当前嵌入在wxWi
  • 如何在 Jest 中模拟嵌套函数?

    我收到这个错误 Cannot find module httpsGet from functions getSecureString test js httpsGet 是我自己的功能 位于按钮处getSecureString js 并通过调
  • 使用 OuterRef 的简单子查询

    我正在尝试做一个非常简单的Subquery使用OuterRef 不是为了实际目的 只是为了让它工作 但我一直遇到同样的错误 posts models py code from django db import models class Ta
  • ASP.NET MVC 部分视图不调用我的操作

    我刚刚开始在 ASP NET MVC 上构建一个小型简单网站 在一个页面中我使用部分视图 部分视图代表一个简单的表单 应该在单击按钮时提交 如果我第一次单击它提交的时间成功并返回我的部分视图和验证消息 如果内容无效 但如果我想再试一次 则不
  • “由于共享主机中的‘LOG_BACKUP’,数据库的事务日志已满”

    我有一个 Asp Net MVC 5 网站 在共享托管计划中采用实体框架代码优先方法 它使用开源网站面板 http www websitepanel net 控制面板及其 SQL Server 面板有些限制 今天想编辑数据库的时候 遇到了这
  • Android 在 HttpClient 中收到 403 后得到响应

    我有这样的代码 HttpClient httpClient new DefaultHttpClient HttpPost httpPost new HttpPost server try JSONObject params new JSON
  • 当单个模型被多个视图共享时

    有两种观点 listView QtGui QListView tableView QtGui QTableView 我继续定义一个自定义DataModel供双方使用listView and tableView class DataModel
  • oops 的完整形式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 的完整形式是什么OOPS 有人说面向对象的编程结构其他人说面向对象的编程系统 哪一个是正确的 编程范式是OOP 面向对象编程 其他一切都可以从它
  • 材质 UI - 轮廓选择标签未正确渲染

    根据演示 Material UI 概述选择输入的标签应位于选择框的顶部边框的顶部 然而 在我的应用程序中 z index标签的似乎将其放置在顶部边框后面 因此看起来像一条线穿过标签 我几乎完全从文档中获取了代码 据我所知 没有任何样式与此输
  • AngularDart:使用反应式表单生成器创建表单

    我正在尝试使用创建AngularDart 5 angular forms 2 该API似乎与angular forms 1我不知道如何创建一个FormGroup using FormBuilder and ControlGroup 下面是我
  • python 中真的存在联合类型吗?

    由于Python是动态类型的 我们当然可以这样做 def f x return 2 if x else s 但这是 python 真正的用途吗 或者换句话说 联合类型是否像 Racket 中那样存在 或者我们只像这样使用它们 def f x
  • 使用git中的hooks导入和导出到csv

    我想知道这是否可能 创建连接到 cvs 的共享 git 存储库 post two hooks to it 每次有人从中提取时 它都会从 cvs 存储库导入 每次有人推送它时 它都会导出到 cvs 存储库 基本上创建一个对 git 用户完全透
  • XDT Transforms - 变换变换

    我正在创建一个 nuget 包 其中安装该包的部分结果是修改我的 web release config 我使用 web release config install xdt 将元素插入到此文件中没有问题 但我需要在要插入的元素上保留 xdt
  • Idris 中类型的模式匹配

    可能这是基本的 但我不明白为什么下面的函数回答 1fnc Nat并且 对于fnc 整数 它甚至没有作为模式包含在内 fnc Type gt Integer fnc Bool 1 fnc Nat 2 您不能对类型进行模式匹配 也不应该这样做
  • Leaflet - 可拖动标记和坐标以字段形式显示

    我必须做一个可拖动的标记 它的坐标应该显示在字段中 它将成为 PHP 联系表单的一部分 我创建了一个可拖动标记 请帮助我现在做什么 var marker L marker new L LatLng 53 471 18 744 draggab
  • GMap.net 中的缩放和平移

    我正在努力使GMap Net http greatmaps codeplex com 使用 WPF 内置事件控制启用多点触控 但我没有成功 我发现了一系列关于多点触控的文章 例如this http blogs msdn com b jaim
  • MVC4:嵌套部分视图丢失模型数据

    在 MVC4 项目中 我使用部分视图 该视图使用 ViewModel 并具有 GET 表单 在控制器操作中 我期望 ViewModel 对象包含一些数据 当将此部分放置在普通 cshtml 视图上时 我通过控制器操作中的预期 ViewMod