如何处理集合的每一行重复相同形式的 MVC 模型绑定前缀?

2024-04-07

我的主视图模型有一个 ChildViewModel 的集合。在视图中,我循环遍历集合并调用 EditorFor(),如下所示:

@for (int i = 0; i < Model.Children.Count; i++)
{
    @Html.EditorFor(m => m.Child[i]);
}

编辑器模板如下所示:

@model ChildModel

@using (Html.BeginForm("EditChild", "MyController"))
{
    @Html.HiddenFor(m => m.ChildId)
    @Html.TextBoxFor(m => m.ChildName)
}

这将生成标记,其中每个子项都位于单独的表单中,并且每个此类表单将有一个名称如 Child[0].ChildName 的输入控件。我为每个子项使用单独的表单,因为子项将在每一行上显示一个,然后用户可以编辑并提交一行。

我的表单操作方法是:

[HttpPost]
public ActionResult EditChild(ChildViewModel form) { }

问题是,当调用它时,模型的所有属性都将为空,因为模型绑定器不知道前缀。在某些情况下,我们可以使用 BindAttribute 告诉模型绑定器有关前缀的信息,但在这种情况下,前缀不是常量:它将是 Child[0]、Child[1] 等。

总之,我们希望为集合的每一行重复相同的表单,然后允许用户 POST 单个表单。在这种情况下,Web 如何处理 id、名称、前缀和模型绑定?


我和你有同样的问题,我的解决方案是这样的,希望对你有帮助。

在 EditorTemplate 或部分视图中添加隐藏输入

<input type="hidden" name="__prefix" value="@ViewData.TemplateInfo.HtmlFieldPrefix" />

定义自定义模型绑定器并重写 BindModel 方法

public class CustomModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var prefixValue = bindingContext.ValueProvider.GetValue("__prefix");
        if (prefixValue != null)
        {
            var prefix = (String)prefixValue.ConvertTo(typeof(String));
            if (!String.IsNullOrEmpty(prefix) && !bindingContext.ModelName.StartsWith(prefix))
            {
                if (String.IsNullOrEmpty(bindingContext.ModelName))
                {
                    bindingContext.ModelName = prefix;
                }
                else
                {
                    bindingContext.ModelName = prefix + "." + bindingContext.ModelName;

                    // fall back
                    if (bindingContext.FallbackToEmptyPrefix && 
                        !bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName))
                    {
                        bindingContext.ModelName = prefix;
                    }
                }
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

模型绑定器将修剪前缀并使默认模型绑定起作用。

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

如何处理集合的每一行重复相同形式的 MVC 模型绑定前缀? 的相关文章

  • MVC3、Ninject、MvcSiteMapProvider - 如何将依赖项注入到重写方法

    我有一个正在使用的 MVC3 应用程序Ninject http ninject org and Mvc站点地图提供者 http mvcsitemap codeplex com 我创建了此类 MvcSiteMapProvider 使用它来动态
  • 使用编辑器模板和单选按钮

    我以表格格式显示数据 该表是在使用时自动生成的EditorFor 和 EditorTemplates 在表格的每一行中 我显示 ID 姓名 国家 地区下拉列表 爱好选择的复选框和性别选择的单选按钮 一切都工作正常 但我无法绑定性别单选按钮
  • Ajax.BeginForm 无法与 Html.ValidationSummary 一起使用

    我正在尝试使用 Ajax BeginForm 将数据发布到控制器 如果出现特定错误 表单应重新呈现并显示添加到 ModelState 的自定义错误消息 由于某种原因 错误消息未显示 我什至正在尝试以下不起作用的测试用例 我是否遗漏了什么 E
  • Asp.Net Mvc/ jQuery 中带进度条的文件上传?

    我正在寻找一个用于 Asp Net MVC 的带有进度条的文件上传的 jQuery 插件 我们在现有的 Asp Net WebForm 应用程序中使用 RadUpload 控件 它在不使用 Flash Silverlight 的情况下显示状
  • ASP.Net Web API:在读取/上传请求正文之前发送响应

    我的控制器上有一个操作 应该上传大型 500mb 2gb 文件 例如 HttpPost public void PostFile FromUri Guid uploadId 在正文内部 执行一些检查 例如 uploadId 是否存在 然后将
  • 如何使用 ASP.NET MVC 进行 HTTP 调用?

    我正在尝试做的事情 我试图练习进行 HTTP 调用 如果这就是它的名字 来自一个简单的 ASP NET MVC Web 应用程序 为此 我尝试从以下位置获取天气详细信息打开天气地图 http openweathermap org appid
  • AspNet vNext 上的 Kestrel 不提供 / 下的索引页面

    我需要能够在默认网址下提供我的 index html 使用 Kestrel Web 服务器 现在我只能使用完整路径访问我的静态文件 即 index html 同样 这在 VisualStudio 上完美运行 上下文是带有 Kestrel 的
  • ASP.Net MVC MvcBuildViews 大幅增加编译时间

    我们有一个项目 希望构建视图 以便在视图的 cshtml 文件中有任何错误时生成编译时错误 尽管如此 编译时间仍然急剧增加 MvcBuildViews true需要 62 秒 MvcBuildViews false需要 9 秒 这是可以接受
  • MVVM ViewModel 与 MVC ViewModel

    ViewModel 是一个在 MVVM Model View ViewModel 和 ASP NET MVC 的推荐实现中使用的术语 鉴于每种模式都使用相同的术语 研究 ViewModel 可能会令人困惑 MVC ViewModel 和 M
  • 如何简化 ASP.NET MVC 中的全状态交错模式对话框

    我需要在多对多模式对话框中保留状态渐进增强 http en wikipedia org wiki Progressive enhancementASP NET MVC 项目中的方式 在我的代码中 当禁用 javascript 时 模式对话框
  • Asp.Net Mvc 复选框的默认值?

    model DefaultValue true public bool IsActive get set view Html CheckBoxFor model gt model IsActive html 输出 这是我的预期
  • JQuery Ajax 和将多个复杂对象发布到 asp.net MVC 控制器

    您好 将多个参数发布到 mc 控制器方法时出现问题 controller HttpPost public ActionResult SaveSomething SomeDomainObject domainObject bool anOpt
  • 提交表单时获取查询字符串值...MVC3

    在我的 MVC3 应用程序中 如果我在 url 中输入查询字符串值并按 Enter 键 我可以获得输入的值 localhost 34556 db test 我将触发的默认操作 public ActionResult Index string
  • 如何使用多个项目将大型 ASP.NET MVC 站点分成多个部门?

    假设我有一个非常大的网站 例如 amazon com 我想在整个网站上使用 asp net mvc 但拥有一个包含数百名贡献者的大型项目是不切实际的 我想将工作分成每个部门的书籍 工具 玩具 杂货等项目 然后 当他们构建并交付新版本时 我只
  • 在执行 ASP.NET 的 Visual Studio 2008 中未声明“__o”

    在执行 ASP NET MVC 时 我在 Visual Studio 2008 中经常遇到这个恼人的错误 bug 未声明 o 问题是什么 我该如何解决 只需将其添加到页面顶部即可 所以现在我的 ASP Net 内容占位符如下所示
  • ASP.NET MVC 3,如何正确制作主题

    我正在寻找有关如何以最佳方式在 MVC 3 中实现 主题 的输入 我想需要一个自定义视图引擎来负责定位视图文件等 我还希望主题系统是可扩展的 这样 如果它只是其中一个视图 我想更改其他视图 但仍使用默认值 有点像 Orchard 项目吗 想
  • Razor 如何创建一个复选框并使其只读?

    我正在使用 MVC 3 和 Razor 目前我正在使用 model MyProject ViewModels MyViewModel foreach var item in Model MyProperty tr td Html Actio
  • WebService ASP.NET MVC 3 发送和接收

    这几天我一直在绞尽脑汁思考如何满足新的要求 我有两个网站 第一个让用户填写申请表 第二个网站是用于管理用户应用程序的内部网站 我需要开发一个 Web 服务 将应用程序数据从网站 1 发送到网站 2 并向网站 2 返回成功或失败的响应 我以前
  • MVC4 捆绑:由于 css3 功能而缩小失败?

    我想使用 MVC4 捆绑和缩小 但我总是在未缩小的 css 文件中收到此错误消息作为注释 Minification failed Returning unminified contents 534 29 run time error CSS
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g

随机推荐

  • Pandas 将列从一个数据框复制到另一个具有不同名称的数据框

    我必须从一个 DataFrame 复制列A到另一个数据框B 中的列名称A and B不匹配 最好的方法是什么 像这样的专栏有好几个 我需要为每一列写类似的内容吗B SO A Sales Order etc 我会用pd concat http
  • 蓝牙广播

    我想使用蓝牙将数据从一台设备广播到附近的众多设备 现在 我知道蓝牙广播的存在 但是可以使用 Android 现有的 API 吗 如果没有 是否有其他可用的第三方 API 有能力实现这一点 关于蓝牙广播的另一个问题 您是否可以开始收听正在进行
  • 基于路径的遮罩具有良好的抗锯齿功能

    我想用圆圈掩盖一个正方形 我使用它而不是圆角半径 因为我想稍后对动画进行处理 我可以将其遮盖 但边缘非常粗糙 Target View let targetView UIView frame CGRect x 0 y 0 width 100
  • SharePoint REST 在单个 REST 查询中获取用户标题

    我有一个包含 人员和组 列的列表 当我使用 REST 查询行时 我得到此列中列出的用户 ID 我发现这篇文章将帮助我将每个 id 转换为标题 http www codeproject com Articles 692289 How to G
  • 将 pandas 中的数字格式化为以千或百万为单位的货币

    我有一个数据框 pd DataFrame Amount 19000000 9873200 823449242 我需要将数字转换为以百万计的货币 即 19 00MM 9 88MM 和 823 45MM 有谁知道一个快速的方法来做到这一点 Th
  • 如何根据子列表的长度对列表列表进行排序[重复]

    这个问题在这里已经有答案了 我有以下清单 a a b c d e f g h i j k l m n o 我想根据子列表的长度对列表进行排序 结果应该是这样的 a o d e m n a b c f g h i j k l Use key参
  • 从 SQL Server 检查后台进程

    我有一个后台进程正在运行 它在运行时可以在任务管理器中看到 我需要从我的数据库检查该进程是否正在运行 我尝试过以下查询 select from sys dm os threads select FROM sys dm os tasks 但它
  • 为什么切换到 jQuery 3 后我的“load”事件/函数没有被执行?

    自从我升级到jQuery 1 x jQuery 2 x to jQuery 3 x 我现有的代码将不再正确执行 一切正常 但load事件侦听器不再被触发或只是有时被触发 function window on load function th
  • 使用 Vue 为锚标记中的 href 赋值

    听起来很愚蠢 但我找不到传递 href 中定义的变量数据的方法 组件文件 vue 我尝试了所有这些 a href url a a href url a a href url a a url a a url a export default
  • Android - 两句话,两种样式,一个TextView

    我正在尝试显示一个包含两个句子的 TextView 我希望它们是一个接一个的 如下所示 AAAAAA BBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBB 其中 A 是句子的第一个单词 部分 B 是第二个句子 A 和 B 的大
  • 禁止 python markdown 在

    中换行文本

    我正在使用Pythonmarkdown https python markdown github io 作为 Jinja2 生成 html 的过滤器 作为其中的一部分 我从渲染输入中填充表条目 通过 markdown 过滤器传递输入总是将文
  • PHP - 替换所有支持的语言的所有非字母数字字符

    嗨 我实际上正在尝试替换字符串中的所有非字母数字字符 如下所示 mb ereg replace a z0 9 s i string 第一个问题是它不会替换像这样的字符 从字符串中 其次 我想为此方法添加对所有用户语言的多位支持 我怎样才能做
  • 如何使用 Qt“在 Finder 中显示”或“在资源管理器中显示”

    是否可以在 Windows 资源管理器 OS X Finder 中打开一个文件夹 然后选择 突出显示该文件夹中的一个文件 并以跨平台方式执行此操作 现在 我做类似的事情 QDesktopServices openUrl QUrl fromL
  • 如何以 jquery ui 风格创建标准组合框(选择)?

    There is http jqueryui com demos autocomplete combobox启用自动完成功能的组合框 如何以相同的样式创建组合框但没有自动完成功能 只有几个固定值 如果我理解正确 您不想允许用户输入 并且应通
  • Spring 3.0如何做后台计算?

    在春季应用程序中 我想做一些后台计算 任务是我保存一个实体 比如说 GPS 坐标 然后我想查询 Web 服务以获取所有坐标之间的距离并将它们存储在数据库中以供以后使用 存储实体后 有可能无法连接到将用于计算距离的 Web 服务 我认为这可以
  • 在 Python 的 argparse 中多次使用相同的选项

    我正在尝试编写一个接受多个输入源并对每个输入源执行某些操作的脚本 像这样的东西 my script py i input1 url input1 name input1 other var i input2 url input2 name
  • 使用索引迭代向量的子集

    我可以遍历目录中的所有文件 但是 我想迭代某些文件而不是所有文件 我想使用索引 我想通过使用来做到这一点file id向量 每个向量元素将是 文件 中的索引 例如 我在一个目录中有 500 个文件 我只想迭代三个文件 即文件 2 4 15
  • PrimaryKeyAttribute 不起作用 Restkit/核心数据

    我刚刚安装了框架restkit 0 9 3并按照讨论板示例进行操作 好吧 一切都工作得很好 但是当我尝试使用核心数据时 即使在声明了他的primaryKeyAttribute userID 之后 我的 User NSManagedObjec
  • 由于本机基础模块,Expo for Web 无法编译

    我正在尝试让 网络博览会 部分适用于我的托管博览会项目 我将我的托管 expo 项目升级到 expo sdk 33 以便我还可以在 Web 平台上部署我的应用程序 并且最好从 Firebase 托管它 我遵循了世博会的官方指示 升级Expo
  • 如何处理集合的每一行重复相同形式的 MVC 模型绑定前缀?

    我的主视图模型有一个 ChildViewModel 的集合 在视图中 我循环遍历集合并调用 EditorFor 如下所示 for int i 0 i lt Model Children Count i Html EditorFor m gt