ASP.NET MVC 更新一个表单上的对象列表? (模型绑定到列表)

2024-02-06

关于更新 ASP.NET MVC 中的项目列表的快速问题。

基本上我有一个编辑操作方法,它返回对象的集合(顺便说一句,其表结构如下所示“testID,assetID,Result” - 链接表)。

我基本上希望这些项目在表单中一个接一个地显示,并且能够编辑它们。表单应该发回,模型绑定器就会发挥它的魔力。但是,事情并不那么容易。

我已经在网上搜索过,似乎有关此内容的大部分信息似乎都有点过时了。我遇到过这个帖子 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx,已经很久没有更新了,this one http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx这似乎表明您不应该绑定到已存在的列表进行更新,并且使用 EF 或 Linq to Sql(我就是)时会出现问题。

有没有一种简单的方法可以实现我想要的?发布版本中列表模型绑定的状态是否发生了变化?

更新 - 更接近一点......

这是我的编辑方法:

public ActionResult EditSurveyResults(Guid id)
    {
        var results = surveyRepository.GetSurveyResults(id);
        return PartialView("EditSurveyResults", results);
    }

还有我的表格:

<div id="editSurveyResults">
<h2>
    EditSurveryResults</h2>

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm())
   {%>
<fieldset>
    <legend>Results</legend>
    <% int i = 0; foreach (var result in Model)
   { %>

    <input type="hidden" name='results[<%= i %>].TestID' value='<%= result.TestID %>' />
    <input type="hidden" name='results[<%= i %>].AssetID' value='<%= result.AssetID %>' />
    <p>
        <%= result.Task.TaskName%>
    </p>
    <p>
        <label for="Result">
            Result:</label>
        <input type="text" name='results[<%= i %>].Result' value='<%= result.Result %>' />
        <%= Html.ValidationMessage("Result", "*")%>
    </p>

    <% i++; } %>
    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
<% } %>

我的编辑 POST 方法:

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult EditSurveyResults(Guid id, IList<SurveyTestResult> results)
    {
        var oldValues = surveyRepository.GetSurveyResults(id);

        if (ModelState.IsValid)
        {
            UpdateModel(oldValues);
            surveyRepository.Save();
            return Content("Done");
        }
        else
            return PartialView("EditSurveyResults");
    }

当然它并不完整,但它不会更新当前状态的任何内容。我在这里错过了一个技巧吗?结果填充了更新的实体,所以我不确定为什么它不更新......

更新2: 所以,我开始认为模型绑定器不能做这样的事情。所以,我采取了一种更古怪的方式来做事。如果有人能发现此问题,请告诉我。仅供参考 - 该表单将通过 AJAX 获取,因此我不会返回视图,而是返回一条简单的消息。 这是新代码:

IList<SurveyTestResult> oldValues = surveyRepository.GetSurveyResults(id).ToList();
            foreach (var result in SurveyTestResult)
            {
                //SurveyTestResult is the IList that comes down from the form.                    
                SurveyTestResult thisone = oldValues.Single(p => p.AssetID == result.AssetID &&
                    p.TestID == result.TestID);
                //update the old entity with the result from the new one
                thisone.Result = result.Result;
            }

然后我在我的存储库上调用 Save。

提前致谢


我注意到的一件事是你没有渲染<input type="hidden" name='results.Index' value='<%= i %>' /> as 菲尔·哈克斯 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx文章中提到的内容是强制性的。

切换到不同的 Modelbinder 也可能达到目的。我使用 DataAnnotations 模型绑定器,并且我不必生成.Index绑定时的字段List's.

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

ASP.NET MVC 更新一个表单上的对象列表? (模型绑定到列表) 的相关文章

  • 在嵌套列表中查找索引位置以进行匹配

    我想找到嵌套列表和目标值 11 的匹配索引 Data f lt list list 1 2 3 list 4 5 list 8 list 11 12 目标值 11 的所需输出 c 2 3 2 1 Printed f 1 1 1 1 1 1
  • 是否可以手动更新 ModelState.IsValid ?

    我想尽可能使用内置的验证功能 我还想对 CRUD 方法使用相同的模型 但是 由于无法使用标准模式完成下拉列表 因此我必须手动验证它 在回发方法中 我只想验证下拉列表并将此结果添加到 ModelState 中 这样我就不必验证使用数据注释完成
  • 带有委托构造函数的构造函数初始化列表执行顺序

    我有一个棘手的 C 问题 当您有一个带有委托构造函数的构造函数初始化列表时 列表执行顺序是什么 这里存在两个相互冲突的标准规则 1 构造函数初始化列表不是按列表顺序执行 而是按项目的声明顺序执行 2 构造函数初始化列表中的委托构造函数总是在
  • 当我专门通过 Offer 和 poll 访问 LinkedList 时,它是线程安全的吗?

    我有一个链接列表samples protected LinkedList
  • ASP.NET MVC 使用类型化模型将模型与单选按钮列表进行两种方式数据绑定

    我有一个由单选按钮矩阵组成的 mvc 视图 每行单选按钮都在一个组中 代表模型中的一个键入对象 使用各种博客和帖子的指导 我已成功将发布的表单结果绑定到控制器操作中的类型化模型数组 但是似乎无法成功反转效果并将现有模型绑定到单选按钮 同时保
  • 如何在aspasp.net MVC中隐藏Webgrid中的列?

    我是 MVC 新手 我使用Webgrid展示一些客户价值 我需要将列及其标题隐藏起来 我该怎么做呢 CSS gridhide visibility hidden Code grid Column Id ID style gridhide 我
  • 全局访问 Ninject 内核

    这个问题与 Ninject 没有具体关系 这更多的是一个一般性的编码问题 但我将其发布在这里 以防在 Ninject 中可能有更好的方法来完全处理该问题 而不是我正在尝试做的事情 我想知道是否可以从 Global asax 中的实例全局访问
  • 返回 JSON 或部分 html 的 ASP.NET MVC 控制器操作

    我正在尝试创建控制器操作 该操作将根据参数返回 JSON 或部分 html 将结果异步返回到 MVC 页面的最佳方法是什么 在您的操作方法中 返回 Json object 以将 JSON 返回到您的页面 public ActionResul
  • 性能问题:StringCollection 与 List

    我想知道什么时候应该使用列表当我应该使用字符串集合 假设我必须处理大量字符串 例如 10mb 的文本文件 我知道列表提供比字符串集合 但有时我会找到列表slow例如 当告诉 Gridview 它的数据源是 List 时 那么有人知道这些集合
  • 如何创建多维列表

    我想初始化一个多维列表 基本上 我想要一个 10x10 网格 一个包含 10 个列表的列表 每个列表包含 10 个项目 每个列表值应初始化为整数 0 简单地做到这一点的明显方法是 myList 0 10 10不起作用 因为它会生成一个包含
  • 添加按钮,该按钮将重定向到 JQGrid 中当前行的“查看页面”

    我正在尝试添加按钮而不是View专栏但我尝试过formatter仍然按钮未加载 但其余列的记录即将到来 下面是我的代码 function grid jqGrid url Location LocationsList1 datatype js
  • 如何从子动作中获取当前控制器和动作?

    我的视图的一部分是通过调用子操作的 RenderAction 呈现的 如何从该子操作中获取父控制器和操作 当我使用 ViewContext RouteData Values action 我取回了子操作的名称 但我需要的是父 调用操作 Th
  • 无法将代码优先迁移应用到 mysql 数据库

    我正在使用 EF 代码优先模型开发 asp net mvc 我正在尝试首先使用 EF 代码将迁移应用到我的项目中 我正在使用 MySql 数据库 目前我使用的是 EF 4 3 1 版本和 6 6 4 0 版本的 mysql Connecto
  • FluentValidation:验证类型名称必须是唯一的

    我的代码中指定了以下规则 RuleFor x gt x Auction Round1Ring1Start GreaterThan DateTime Now RuleFor x gt x Auction Round1Ring1End Grea
  • 在实体框架中不使用 Dispose 或 using()

    我一路上正在编写一个网络应用程序并学习实体框架 如果我做错了什么 我很好奇 我在查询时没有使用过 dispose 或 using 语句 我的存储库示例 public User GetUserById int sessionId var us
  • global.asax Application_AcquireRequestState 与 Application_BeginRequest

    有什么不同 我想在我的应用程序中实现语言下拉选择 因此 当选择选定的语言时 将设置线程区域性并重新加载页面 Like so Thread CurrentThread CurrentCulture CultureInfo CreateSpec
  • 如何连接 R 列表中的多个 .wav 文件?

    我有一个 wav 文件列表my list library seewave library tuneR data tico audio lt tico freq lt 22050 breaks lt c 0 0 2 0 4 0 6 0 8 i
  • 如何在 ASP.Net MVC 或等效控件中构建复合控件或模板控件?

    在我们当前的 ASP Net Webforms 应用程序中 我们有几个复合 模板服务器控件 它们的存在只是为了具有共同的外观和感觉 例如 我们有一个面板控件 它有一个标题 一个与面板内容相关的按钮位置 当然还有内容 在 MVC 中如何最好地
  • 配置的托管模块出现 Asp.net MVC 错误

    我有自定义身份验证HttpModule这是相当困难的 但我希望它仅针对托管请求运行 而不是静态请求 Asp net MVC 自动添加 IIS7 Web 服务器的配置部分
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于

随机推荐