ASP.net MVC - 用于 POST 操作的单独 ViewModel

2023-12-03

在我的 MVC 应用程序中,我有一个与此类似的视图模型:

public class ComplexViewModel
{
    public ComplexDetailsViewModel Details1 { get; set; }
    public ComplexDetailsViewModel Details2 { get; set; }
}

public class ComplexDetailsViewModel 
{
    public int Id { get; set; }
    public string DisplayValue1 { get; set; }
    public string DisplayValue2 { get; set; }
    // ...
}

在我看来,我最初是在做以下事情:

@Html.HiddenFor(model => model.Details1.Id)
@Html.HiddenFor(model => model.Details2.Id)

@Html.DisplayFor(model => model.Details1.DisplayValue1)
...

我会将完整模型发布到控制器:

 public ActionResult Post(ComplexViewModel model)

除了 Id 值之外,我实际上不需要 ComplexViewModel 中的任何内容,因此我决定创建另一个专门用于发布数据的视图模型:

public class PostViewModel
{
    public int Details1Id { get; set; }
    public int Details2Id { get; set; }   
}

public ActionResult Post(PostViewModel model)

问题是现在我的@HiddenFor(model => model.Details1.Id)没有映射到我的 POST 模型,因此实际上没有发布任何内容。

有没有办法让我的 POST 模型和 GET 模型具有单独的结构,同时仍然使用HiddenFor帮手?


仅仅因为您没有使用 POST 版本中的所有数据并不意味着您必须创建另一个模型。为什么不保持简单呢?

它应该是这样工作的:

您的帖子详细信息视图应该强类型化为特定的视图模型。然后在你的控制器中你有两个名为 Post 的操作结果,例如,一个用[HTTPGET]属性,并且您要发布到的操作用[HTTPPOST]属性。此外,您的 get 方法应采用诸如帖子 id 之类的参数,而您的 post 方法应采用模型作为参数。

要正确执行服务器端验证,您可以像这样装饰类属性:

public class ComplexDetailsViewModel 
{
    [Required]//Works for just the Id property
    public int Id { get; set; }
    public string DisplayValue1 { get; set; }
    public string DisplayValue2 { get; set; }
    // ...
}

现在在你的控制器中你可以使用这个布尔值:ModelState.IsValid。基本上,如果他们关闭了 JavaScript 并且模型发布时没有Id那么该模型将无效。

这种模式非常强大,可以快速实现客户端和服务器端验证。当然,客户端验证使用开箱即用的 jQuery,因此我们可以轻松扩展验证器。您甚至可以非常快速地进行 AJAX 验证。当我构建表单时,我不会在验证方面做出任何牺牲……因为不需要时间就能正确完成它。

回答你原来的问题:

视图只能强类型化到一个模型。您无法使用一个模型加载视图,然后使用另一个模型发布它(据我所知)。我认为如果你想这样做,你的问题就在于你构建模型的方式。

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

ASP.net MVC - 用于 POST 操作的单独 ViewModel 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • 你能用 javascript (jxa) 编写文件夹操作吗?

    我正在寻找 AppleScript 的直接翻译 on adding folder items to this folder 但我似乎无法在任何地方找到它 无论是术语的用法还是关键字 this folder 本身 使用 Automator 我
  • 在引导输入字段中放置清除按钮

    我试图在输入字段内 搜索图标之前的右侧放置一个清除按钮 但它不起作用 x 显示在输入字段的前面 我使用绝对定位 right 0 和 top 4px 您可以在这里查看我的示例 http www bootply com YUwdJ5Kvx6 一
  • Delphi Windows 服务设计

    Delphi Windows 服务设计 我从未创建过 Windows 服务 但一直在阅读我发现的所有内容 我遇到的所有文章或示例在实现上都非常基础 并且范围有限 还没有看到任何超出此范围或解决特定场景的内容 所以 我已经掌握了我可能会找到的
  • jQuery 的“uploadProgress”未在“$.ajax”中触发

    我是 jQuery 新手 现在正在处理文件上传 我想在每次上传图像时添加一些进度条 我用的是uploadProgress在 jQuery 中 但它似乎不起作用 这是我的代码 form on submit function e var fil
  • Progress 元素内的 html 文本

    您好 有人可以帮我处理这个进度 html 元素吗 我需要能够在进度的右侧放置一个文本值 并根据进度是否减少文本来配合该元素 progress webkit appearance none progress webkit progress b
  • 在 OleDbCommand 中使用“... where Column like ...”不起作用

    我正在使用 C 从 Access 我认为是 2003 或 2007 数据库中选择某些内容 但它没有选择任何内容 我在 Access 本身中尝试了 SQL 语法 它似乎工作正常 我对 C 和 Access 相当陌生 到目前为止我所拥有的 Ol
  • Jquery 从脚本标签获取文本时出现问题?

    我有这个小 HTML 文档
  • 在 Windows 10 中批量运行 VBS 脚本时解压缩文件错误

    运行VBS时解压码在 Win 10 中执行批处理 出现以下错误 鉴于其他人之前曾报告过它可以工作 这可能是什么原因 更改目标目录或显式设置它们不会影响该错误 echo off setlocal enabledelayedexpansion
  • python:直接编辑ISO文件

    是否可以获取 ISO 文件并直接编辑其中的文件 即不解压 更改文件并重新打包 1 可以用Python来做吗 我该怎么做呢 您可以用于列出和提取 我测试了第一个 https github com barneygale iso9660 blob
  • 为 Sklearn 重塑数据

    我有一个颜色列表 initialColors u black u black u black u white u white u white u powderblue u whitesmoke u black u cornflowerblu
  • 角度 $watch |从函数返回项目

    我很想知道为什么我总是必须这样做 scope watch function return scope someData function value console log value 为了让 Angular 真正观察数据 为什么我必须这样
  • Web 配置文件中的 Windows 模拟代码错误

    我在 Web 配置文件中声明了以下部分以允许模拟 我已将该文件夹共享给另一台计算机上的网络内的公共访问
  • 使用 *args、**kwargs 和可选/默认参数调用 Python 函数

    在Python中我可以定义一个函数如下 def func kw1 None kw2 None kwargs 在这种情况下 我可以打电话func as func kw1 3 kw2 4 who knows if this will be us
  • Twitter 未捕获类型错误:未定义不是函数

    我已将 Twitter 小部件使用中遇到的错误范围缩小到事件绑定 twttr events bind tweet function event addShared or twttr events bind tweet addShared 似
  • 将 IE 浏览器与 Visual Basic 结合使用

    正在努力寻找解决这个问题的方法 从 Visual Basic 更具体地说是 Excel 中的 VBA 中 我可以使用以下命令按标题调用 Internet Explorer 窗口 AppActivate My Page Title Windo
  • vscode 扩展 - 如何记录击键

    我正在做用户测试vscode extension 对于某些大学项目 我需要获取文本编辑器中按下的按键的日志 我尝试过onDidChangeTextDocument 但这不会捕获不修改文档的击键 例如 Ctrl 或 Alt 我还尝试向活动文本
  • 使用 Chart.jscanvases 将 HTML 内容导出为 PDF

    我有一个 HTML 页面 其中包含由 Chart js 生成的大约 10 个图表 因此这些是画布元素 我希望能够将页面内容导出到 PDF 文件中 我尝试过使用jsPDF的 fromHTML函数 但它似乎不支持导出画布内容 要么是我做错了 我
  • 使用 Google Apps 脚本插入 YouTube 顶级评论

    我正在尝试使用 Google Apps 脚本创建一个程序 该程序会在某个 YouTube 频道上传时插入评论 我已经能够从频道获取最新的 YouTube 视频 ID 但是当我尝试插入评论时 它会抛出错误 解析错误 第 19 行 文件 代码
  • AngularFire2:使用 RxJS .map() 在 FirebaseListObservables 上执行“连接”

    正如另一个问题所述 我正在开发一个使用 Firebase 作为后端的 Ionic 2 应用程序 我有类别 我有产品 产品属于类别 由于它是 n 到 m 的关系 因此产品和类别存储在 firebase 中的单独节点中 我将数据结构化如下 Fi
  • ASP.net MVC - 用于 POST 操作的单独 ViewModel

    在我的 MVC 应用程序中 我有一个与此类似的视图模型 public class ComplexViewModel public ComplexDetailsViewModel Details1 get set public Complex