需要帮助使用嵌套模型的 DefaultModelBinder

2024-01-11

有一些相关的问题,但我找不到有效的答案。

假设我有以下模型:

public class EditorViewModel
{
  public Account Account {get;set;}
  public string SomeSimpleStuff {get;set;}
}

public class Account
{
  public string AccountName {get;set;}
  public int MorePrimitivesFollow {get;set;}
}

以及延伸的视野ViewPage<EditorViewModel>它执行以下操作:

<%= Html.TextBoxFor(model => model.Account.AccountName)%>
<%= Html.ValidationMessageFor(model => model.Account.AccountName)%>
<%= Html.TextBoxFor(model => model.SomeSimpleStuff )%>
<%= Html.ValidationMessageFor(model => model.SomeSimpleStuff )%>

我的控制器看起来像:

[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{ /*...*/ }

如何让 DefaultModelBinder 正确绑定我的 EditorViewModel?无需执行任何特殊操作,我就会得到 EditorViewModel 的空实例,其中所有内容均为 null 或默认值。

我最接近的是通过打电话UpdateModel手动:

[HttpPost]
public virtual ActionResult Edit(EditorViewModel account)
{
    account.Account = new Account();
    UpdateModel(account.Account, "Account");
    // this kills me:
    UpdateModel(account);

这成功更新了我的帐户属性模型,但是当我调用 UpdateModel 时account(为了获取 EditorViewModel 的其余公共属性)我得到完全无用的“类型模型......无法更新”。没有内部异常,所以我无法弄清楚出了什么问题。

我该怎么办?


绑定器变得很困惑,因为它看到操作方法的参数被命名为account,它会看到名为的传入表单字段账户.账户名,因此它正在您的 EditorViewModel 上寻找 AccountName 属性。

您可以通过将参数重命名为与传入表单字段不冲突的其他名称来解决此问题,或者可以在参数上粘贴 [Bind(Prefix = "")] 属性。该属性表示“忽略参数命名的事实account,并假装我给了它一个空字符串名称。”然后活页夹将寻找账户.账户名代替账户.账户.账户名.

编辑-更多信息:

当绑定器看到一个名为的复杂参数时foo,它会查看当前对名为 *foo.** 的内容的请求。所以如果你的参数被命名为foo它的类型有一个名为的属性,输入值预计为foo.FirstName=约翰, 例如。

但是,如果活页夹没有看到 *foo.** 作为请求的一部分,它只会直接查找 *(没有foo字首)。因此,只要请求中不存在 *foo.** ,您就可以提交名字=约翰活页夹会正确理解这一点。但如果请求中有任何 *foo.** ,名字=约翰值将与 FirstName 属性不匹配。

您现在可以看到如何将操作方法​​的参数与其属性之一同名,从而摆脱这种逻辑。

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

需要帮助使用嵌套模型的 DefaultModelBinder 的相关文章

随机推荐

  • 向有限用户大规模部署 Google Apps 脚本支持的电子表格

    我们有100多个用户 我们为他们一一创建了一个谷歌电子表格 并要求他们在电子表格中输入原始数据 当前的工作流程是我们有一个程序将电子表格逐一导出为 CSV 文件并将其导入到我们的后端系统 没关系 现在 我们了解到 Google Apps 脚
  • 在 Java db (Netbeans) 中创建外键

    我在通过 Netbeans 在 Java Db 中创建外键时遇到问题 我很确定我必须使用 SQL 命令将 PLAYERS 表中的属性更改为外键 因为我只能通过界面指定主键 我尝试执行这个命令 ALTER TABLE PLAYERS ADD
  • 无法对未注册的加载器类型执行此操作

    我正在使用散景进行数据可视化 并尝试制作可执行文件 但它显示错误消息 无法对未注册的加载程序类型执行此操作 我尝试过作为解决方案init py 到我的 script py 的目录 subdir 但它不起作用 附言 Win10 Python
  • 命令“python setup.py Egg_info”失败,/tmp/..../ 中的错误代码为 1

    我在安装依赖项时遇到以下错误pip pip9 exceptions InstallationError 命令 python setup py Egg info 失败 错误代码为 1 tmp tmpoons7qgkbuild opencv p
  • 如何让 JavaFX ListView 成为其项目的高度?

    如果我创建一个ListView new ListView lt gt FXCollections observableArrayList 1 2 3 我希望它创建一个包含 3 行的 ListView 但事实并非如此 它创建一个包含 17 行
  • 如何查找解决方案中的所有引用(即所有项目)?

    我们有一个包含很多项目的大型解决方案 有些项目引用相同的 DLL 我需要替换一个 DLL 有没有一种方法可以查看整个解决方案中有哪些参考文献 这样我就不必逐一检查每个项目 我想查看整个解决方案的参考 而不是每个项目的参考 是否可以 只是为了
  • 函数将多列返回为单列而不是多列

    我正在 PostgreSQL 9 04 中编写一个函数 尝试使用将在 select 语句中使用的变量 然后返回结果 我的声明很简单并且有效 但是 所有列都输出到单个列而不是多个列 我的功能 create or replace functio
  • 禁用用户通过电子邮件确认后Keycloak自动登录

    我们将 keycloak KC 与自定义提供程序一起用于注册流程 在注册流程结束时 在将确认电子邮件发送给用户之前 作为默认 KC 功能 我们会禁用该用户 因为它适合我们的用例 当用户单击电子邮件确认时 邮件将被确认并且用户将自动登录 尽管
  • 实例方法和实例变量的线程安全

    我想知道类的每个实例是否都有该类中方法的自己的副本 可以说 我有以下课程MyClass public MyClass private String s1 private String s2 private String method1 St
  • HTML/CSS 中是否有等效的 XAML 网格元素?

    我对 WPF XAML 等有很深的经验 但是 我需要用 HTML CSS JS 创建一些东西 在 WPF 和 Silverlight 中 有一个非常通用的元素 那就是 网格 它本质上是一个托管任何类型的视觉对象的列表 这些对象将根据行 列集
  • 实时音频流套接字卡在浏览器中

    我正在尝试设置一个可以收听多个 私人 流的页面 不幸的是我无法让它运行 我试过使用php在android上打开实时音频流 https stackoverflow com questions 11472997 using php to ope
  • 如何在Python中使用XPath?

    支持 XPath 的库有哪些 有完整的实施吗 图书馆如何使用 它的网站在哪里 libxml2 http xmlsoft org python html具有许多优点 遵守spec http www w3 org TR xpath 积极发展和社
  • Java开发工具包中的jar.exe在哪里? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从以下位置下载并安装了 JDKJava SE 开发工具包 7 下载 http www oracle com technetwork ja
  • 带有模板函数名称并传递参数和返回值的可变参数模板

    以下来自this https stackoverflow com questions 39558976 variadic templates with template function names 39570187 noredirect
  • ggplot折线图中的多行x轴标签

    Edit 该问题已被标记为重复 但回复here https stackoverflow com questions 18165863 ggplot2 labels of grouping values below the plot已尝试但没
  • AWS Elasticsearch 作为主数据库

    我正在开发一个需要存储大量交易 每天 200 万笔 并需要对其进行全文搜索的应用程序 我需要保存至少 10 年的数据 考虑到性能和数据完整性 我可以使用 aws elasticsearch 作为我的项目的数据库吗 一如既往 这取决于 这取决
  • apc.按路径过滤?

    如何在 APC 操作码缓存中使用 apc filters 参数来不缓存某些路径 例如 我希望缓存对路径下的任何内容都处于活动状态 var www vhosts 并排除类似的路径 usr share psa horde 我尝试使用 apc c
  • 查找所有点对之间的欧氏距离

    我的列表中有 8 个点 我需要计算所有可能对之间的欧氏距离 我可以编写一个 for 循环并继续计算距离 但是 python numpy 其他有更好的方法 方法吗 坐标点 x1 y1 x2 y2 x3 y3 xn yn 是的 您可以使用euc
  • css 锚定 div 到页面底部

    我可能很快就会把头从墙上弹下来 我不敢相信像这样愚蠢的事情完全打败了我 因此我向你求助 Stack Overflow 寻求指导和启发 Problem 将 div 放置在页面底部 宽度为 100 位于任何类型的包装器之外 建议的解决方案 ht
  • 需要帮助使用嵌套模型的 DefaultModelBinder

    有一些相关的问题 但我找不到有效的答案 假设我有以下模型 public class EditorViewModel public Account Account get set public string SomeSimpleStuff g