处理回发数据中的数组 - MVC3

2024-02-29

我目前是一名 WebForms 开发人员,正在尝试转向 MVC。我对 MVC 感到非常兴奋,而且我真的很开心,但我遇到了一个奇怪的问题。所以我想做的是为“小部件”创建一个高级编辑器。我已经发布了下面的代码。

当您添加前 4-5 个项目时,一切似乎都工作正常,但当您删除第二个项目时,就会出现问题。这是一个视觉示例。

首先添加 4 个值。

但是当我们删除第二个值时就会出现问题。我们最终得到这个...

我似乎无法理解为什么这个属性在以下两行代码之间表现不同。

@Model.Values[i]
@Html.TextBoxFor(m => m.Values[i])

我的猜测是 @Model 和 (m =>m) 不引用同一个对象?

这是我的小部件类。

public class Widget
{
    #region Constructor

    public Widget()
    {
        ID = 0;
        Name = string.Empty;
        Values = new List<string>();
    }

    #endregion

    #region Properties

    [Required]
    [Display(Name = "ID")]
    public int ID { get; set; }

    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }

    [Required]
    [Display(Name = "Values")]
    public List<string> Values { get; set; }

    #endregion
}

我的控制器看起来像这样。

public ViewResult EditWidget(int id)
{
    return View(_widgets.GetWidgetByID(id));
}

[HttpPost]
public ActionResult EditWidget(Widget widget)
{
    if (!TryUpdateModel(widget))
    {
        ViewBag.Message = "Error...";
        return View(widget);
    }

    if (Request.Form["AddWidgetValue"] != null)
    {
        widget.Values.Add(Request.Form["TextBoxWidgetValue"]);
        return View("EditWidget", widget);
    }

    if (Request.Form["DeleteWidgetValue"] != null)
    {
        widget.Values.Remove(Request.Form["ListBoxWidgetValues"]);
        return View("EditWidget", widget);
    }

    _widgets.UpdateWidget(widget);
    _widgets.Save();

    return RedirectToAction("Index");
}

最后是我的观点。

@model MvcTestApplication.Models.Widget

@{
    ViewBag.Title = "EditWidget";
}

<h2>EditWidget</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Widget</legend>

        @Html.HiddenFor(model => model.ID)

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        @for (var i = 0; i < Model.Values.Count; i++)
        {
            @Model.Values[i]
            @Html.TextBoxFor(m => m.Values[i])
            @Html.HiddenFor(m => m.Values[i])
            <br />
        }

        @Html.ListBox("ListBoxWidgetValues", new SelectList(Model.Values), new { style = "width: 100%" })<br />
        @Html.TextBox("TextBoxWidgetValue", string.Empty, new { style = "width: 100%" })
        <input type="submit" value="Add" id="AddWidgetValue" name="AddWidgetValue" class="submitButton" />
        <input type="submit" value="Delete" id="DeleteWidgetValue" name="DeleteWidgetValue" class="submitButton" />

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

发生这种情况的原因是 HTML 帮助程序首先在绑定时查看 ModelState 发布的值,然后在模型中查看。这意味着,如果您在 POST 控制器操作中尝试修改某个值,并且该值是初始 post 请求的一部分,则 HTML 帮助程序将使用初始值,而不是您修改的值。

例如,在您的 EditWidget 操作中,您正在执行以下操作:

if (Request.Form["DeleteWidgetValue"] != null)
{
    widget.Values.Remove(Request.Form["ListBoxWidgetValues"]);
    return View("EditWidget", widget);
}

您应该从模型状态中删除最初发布的值:

if (Request.Form["DeleteWidgetValue"] != null)
{
    var itemToRemove = Request.Form["ListBoxWidgetValues"];
    var index = widget.Values.IndexOf(itemToRemove);
    ModelState.Remove("Values[" + index + "]");
    widget.Values.Remove(itemToRemove);
    return View("EditWidget", widget);
}

所以 POST 请求包含:

Values[0] = 1
Values[1] = 2
Values[2] = 3
Values[3] = 4

在 POST 操作中,您删除了第二项,因此您还应该将其从模型状态中删除,否则 TextBoxFor 助手仍将使用旧的项。

您还可能会发现以下博客文章 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/有用。它适用于 ASP.NET MVC 2 WebForms,但使其适应 Razor 是很简单的。

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

处理回发数据中的数组 - MVC3 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 带有嵌套对话框的选项卡控件中的选项卡顺序 (WS_EX_CONTROLPARENT)

    在 Win32 API C 项目中 我有一个带有选项卡控件 3 个选项卡 的对话框和作为该选项卡控件的子项的 3 个对话框 我使用 DialogBoxParam 加载带有选项卡控件的主对话框 并使用 CreateDialogParam 从资
  • UIPickerview 组件中带有标签的图像

    我的 UIPickerView 有两列 在一列中我想在其旁边显示图像和标签 有用 显示和图像和标签 只是标签在图像下面如何将图像放在左侧 标签放在右侧 我尝试将标签更改为右对齐 但它不起作用 UIView pickerView UIPick
  • 如何添加全局动作事件监听器?

    如何添加全局动作事件监听器 我试过了 Toolkit getDefaultToolkit addAWTEventListener this AWTEvent ACTION EVENT MASK 但它不起作用 示例 要侦听应用程序中的所有 M
  • FileNotFoundException 打开失败:在 Android 上将图像文件保存到内部存储期间 EPERM(不允许操作)

    当我尝试将图像保存到 Android 上的内部存储时 我遇到了这个问题 public static String setImage Bitmap image if image null FileOutputStream outputStre
  • Tkinter Optionmenu 小部件中相同值的索引

    我正在尝试访问选项菜单小部件中相同值的索引 在下面的代码中 无论我选择两个 b 字符中的哪一个 列表中的字符 b 都会返回索引 1 我需要根据列表中的索引位置区分两个 b 字符 即从选项菜单小部件中选择第一个 b 应返回索引 1 而第二个
  • 如何在Android中读取套接字输入流

    can anybody tell me how to read socket input stream Here is my code if serverIpAddress equals try InetAddress serverAddr
  • 在源代码管理中存储 SSL 证书

    只要您不存储私钥 将 Web 应用程序的 SSL 证书存储在源代码存储库中是否会存在安全问题 使用源代码管理来备份此类内容是多么容易 我有点被宠坏了 并且想充分利用它 但我也不想草率地使用它 或危及安全 不需要 证书是公开的 服务器将在每次
  • 在 golang HTTP FileServer 中设置 Content-Type 标头的 'charset' 属性

    我在测试 golang Web 应用程序时遇到问题 在部署版本中 nginx 位于应用程序前面并显式设置charset utf8 以便所有文本类型都附加字符集声明 在测试中 我直接访问 golang 应用程序 这里的内容类型没有字符集集 当
  • Intent.putExtras 不一致

    我的 AlarmManager 遇到了一个奇怪的情况 我正在使用 AlarmManager 安排一个事件 并使用intent putExtra 传入一个字符串 琴弦要么静音 要么振动 当接收器触发时 手机应该关闭铃声或将手机设置为振动 日志
  • NHibernate 一对一关系

    我有以下内容Domain Model s public class WriteOffApprovalUser public virtual string UserName get set public virtual Employee Em
  • 使用 git add --patch 手动编辑

    因此 我在分支 A 中得到了一个一直在处理的文件 并且我正准备提交它 但是 查看差异 我认为最好将其放入两个单独的提交中 好吧 在这种情况下 也许是两个单独的分支 我之前使用过 git add patch 来暂存单独的帅哥 所以我想我可以使
  • 如何验证 3 个字段中的日期输入?

    我有 3 个用于日期输入的字段
  • 截断 ASP.Net MVC 中的模型属性

    我目前以不同的方式使用截断和文本编辑器 两者都工作正常 但我面临这个问题 我想截断文本编辑器中的文本 T T 我使用这种方式截断及其工作原理 helper Truncate string input int length if input
  • 如何使用 JPA Criteria Query 重写此查询?

    public class Entity private boolean suspended private String code Type type org jadira usertype dateandtime joda Persist
  • Plotly.js:无法显示完整的分类 x 轴

    我必须绘制一个关于时间的 x 轴折线图 x 轴类似于 00 00 00 05 00 10 23 55 使其不是数字而是分类 但是 我可能没有 y 轴上的完整数据列表 例如 仅从 00 00 到 09 00 有数据 数据必须从 00 00 开
  • Clearfix 与 Twitter 引导程序

    我对 twitter bootstrap 有一个问题 对我来说看起来有点奇怪 我有一个固定在左侧的侧边栏和一个主要区域 div div ul li A li li A li li C li li D li li E li li F li l
  • 如何在 Visual Studio 2010 中添加 SIMD 相关编译器标志

    我找到了这个标志列表 http www ncsa illinois edu UserInfo Resources Software Intel Compilers 10 0 main for mergedProjects optaps fo
  • 如何在keras中可视化卷积神经网络中间层的输出?

    最近我创建了用于猫和狗分类的基本 CNN 模型 非常基本 如何使用 keras 可视化这些层的输出 我使用 keras 的 Tensorflow 后端 您可以定义一个模型 获取您想要查看的每一层的输出并进行预测 假设您有完整的模型 cnnM
  • 没有工作树就无法使用 git-pull

    我正在尝试从我刚刚设置的远程存储库中提取数据 并且收到了消息 没有工作树就无法使用 git pull 我读过的所有内容似乎都指向我的 git 目录 但看起来不错 git branch 给出输出 master and git ls tree
  • 处理回发数据中的数组 - MVC3

    我目前是一名 WebForms 开发人员 正在尝试转向 MVC 我对 MVC 感到非常兴奋 而且我真的很开心 但我遇到了一个奇怪的问题 所以我想做的是为 小部件 创建一个高级编辑器 我已经发布了下面的代码 当您添加前 4 5 个项目时 一切