如果 !ModelState.IsValid 则复选框选中值丢失

2024-01-04

我在这里的方法可能完全错误,但我正在慢慢学习 MVC...我有一个表单,用户必须根据此模型选择多个(或不选择)模块:

public class MyProductModule
{
    public string ModuleName { get; set; }
    public bool Checked { get; set; }
}

public class ProductRequest
{

    public ProductRequest()
    {
        Modules = LoadModules();
    }

    public static List<MyProductModule> LoadModules()
    {
        return new List<MyProductModule>()
        {
            new MyProductModule() { ModuleName = "Module One", Checked = false },
            new MyProductModule() { ModuleName = "Module Two", Checked = false },
            new MyProductModule() { ModuleName = "Module Three", Checked = false }
        };
    }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [DisplayName("MyProduct Modules")]
    public List<MyProductModule> Modules { get; set; }
}

渲染一个复选框列表来显示每个模块:

@for (int i = 0; i < Model.Modules.Count; i++)
{
    @Html.CheckBoxFor(m => m.Modules[i].Checked)
    @Html.HiddenFor(m => m.Modules[i].ModuleName)
    @Html.LabelFor(m => m.Modules[i].Checked, Model.Modules[i].ModuleName)
}

最后,表单的处理如下:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ProcessRequest(ProductRequest qd)
{
    if (!ModelState.IsValid)
    {
        return View("Index", qd);
    }
    else
    {
        // check email domains
        List<string> badDomains = new List<string>();
        badDomains.Add("gmail");
        badDomains.Add("yahoo");
        badDomains.Add("hotmail");
        foreach (string s in badDomains)
        {
            if (qd.Email.Contains(string.Format("@{0}.", s)))
            {
                ModelState.AddModelError(string.Empty, string.Format("Please use your work email address.", s));
            }
        }

        if (!ModelState.IsValid)
        {
            return View("Index", qd);
        }
        else
        {
            // process
        }
    }
}

一切都工作正常,除非由于某种原因我的服务器端验证失败,并且模型被发回(return View("Index", qd);)。此时,复选框列表会神秘地发生变化:

[x] Module One
[ ] Module Two
[ ] Module Three

...对此:

[ ] Module One
[ ] Module Two
[ ] Module Three

所有复选框值都会丢失。如果我检查 Firebug 中的原始发布数据,我会发现由于某种原因,true 和 false 都发布为复选框“checked”值:


在服务器端,你的变量qd包含您从视图发布的值: 对于每个MyProductModule你只发布Checked member.

所以当你使用return View("Index", qd);您只向视图提供您拥有的值:Checked member.

如果您想拥有ModuleName会员,您必须将其发布到Checked member

@Html.LabelFor(model => model.Modules, htmlAttributes: new { @class = "required" })
@for (int i = 0; i < Model.Modules.Count; i++)
{
   @Html.CheckBoxFor(m => m.Modules[i].Checked)
   @Html.HiddenFor(m => m.Modules[i].ModuleName)
   @Html.LabelFor(m => m.Modules[i].Checked, Model.Modules[i].ModuleName)
}

好的,我无法重现您的错误,但我可以建议另一种编写方法:使用编辑器模板

代替 for 循环,使用@Html.EditorFor(m => m.Modules)你会得到类似的东西

@using (Html.BeginForm("ProcessRequest", "Home"))
{
    @Html.AntiForgeryToken()
    @Html.TextBoxFor(m => m.Email)
    @Html.EditorFor(m => m.Modules)
    <input type="submit" value="send" />
}

然后创建一个 EditorTemplates 文件夹和一个名为的新视图MyProductModule.cshtml

MyProductModule.cshtml :

@model MyNamespace.MyProductModule

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

如果 !ModelState.IsValid 则复选框选中值丢失 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 从 SQLCE 4 迁移到 SQL Server 2008

    因此 作为早期采用者 我开发了一个基于 SQLCE4 ASP Net MVC3 和实体框架CTP5 http www microsoft com downloads en details aspx FamilyID 35adb688 f8a
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable

随机推荐

  • git 仅从一个分支删除文件

    当我从一个分支删除文件时 它会从所有分支中删除 我能做些什么 使用 git 删除文件并保留该项目状态时 git commit 它只会在该提交及其子项中被删除 说 在该分支中 当将该分支合并到另一个分支时 该文件很可能会被删除 除非在另一个分
  • 如何导出共享案例类的属性

    我正在尝试在服务器和客户端之间共享案例类 我在两端都使用了 upickle 对象及其数据在两端都可以很好地使用 共享类 case class Foo var id Long var title Description 但是我需要在客户端导出
  • 在 iOS 设备上尝试时 Flutter 签名无效

    TL DR 编辑 2020 05 06 我的应用程序从 iOS 13 4 开始正确安装 但一段时间后应用程序在启动时崩溃 我必须重新安装它 我不知道为什么 也许是在 iOS 更新之后 另请参阅下面的答案 https stackoverflo
  • 如何从 python 3.5 脚本创建独立的可执行文件?

    大多数可用程序仅支持 python 版本 3 4 您可以使用py安装程序 http www pyinstaller org支持Python 3 5 要使用 pip 安装它 请在终端中执行 pip install pyinstaller 要制
  • Javascript 匹配在 IE 中不起作用

    我有以下代码 function rgb2hex rgb rgb rgb match rgb d s d s d return hex rgb 1 hex rgb 2 hex rgb 3 似乎在 FF 和 Chrome 中工作正常 IE 给出
  • MavengeneratePackage用于从模式定义生成类的wsdl

    我正在使用 Java14 和 Spring Boot 我需要基于 wsdl 生成一些 Java 类 然而 它正在生成 它将所有生成的类放在平面结构中 而不是放在 wsdl 中指定的包中 如果有人可以提供一些建议 我将不胜感激 更多细节 PO
  • 更改单选按钮图像,帮助

    大家好 我不是一个很好的程序员 但仍然需要做一些编码 现在我在使用 jQuery 更改单选按钮图像时遇到问题 我已经在网上找到了这段代码 但它仍然不起作用 它更改了单选按钮图像 但是当我尝试选择时 它仅更改第一个单选框的图片 每次 这是我的
  • C# List<> 将列表添加到字典

    Dictionary
  • 使用列表元素的名称向列表中的每个数据框添加一列

    我有一个包含多个数据框的列表 每个列表元素都有一个唯一的名称 结构类似于这个虚拟数据 a lt data frame z rnorm 20 y rnorm 20 b lt data frame z rnorm 30 y rnorm 30 c
  • 我如何创建带有下面文本视图的按钮网格

    Hi 我想创建一个像我 尝试 上面绘制的屏幕 A b c d e f g 和 h 是buttons p 是一个EditText 现在我想要完成的是 当部署在更大或更小的屏幕上或旋转时 会发生以下情况 元素 p 保持相同的高度 但水平尺寸 获
  • C# - 抛出异常时无限循环?

    我有以下代码 protected void ExecuteInTransaction Action action using SQLiteTransaction transaction connection BeginTransaction
  • 当另一个字段发生实际变化时,sql server触发器更新时间字段

    我需要一个触发器 如果 表行的一个或多个字段被更新 该触发器就会更新该行字段 假设您有一个雇员表 如下所示 EmployeeId Name Address ModificationDate 1 Spears 27 Sober Road 2
  • 带缓动的动画画布弧线

    我正在画布上画一个非传统的环形时钟 时间由秒环 秒针 分钟环和小时环表示 我正在使用 webkit mozRequestAnimationFrame 在适当的时间进行绘制 我想修改第二个环以快速动画到下一秒 125ms 250ms 并使用二
  • 如何在Python3中使用自签名证书

    我已在 Windows Server 2012 R2 WSUS 服务器 10 66 194 98 Dec15 cer 中生成了自签名证书 并在所有 WSUS 管理 网站中启用了 SSL 现在我想在 python 代码中使用它来与服务器联系
  • Android USB API:在充电和数据发送之间切换

    我开始使用 Android USB API 将数据从 Arduino 发送到 Android 设备 是否可以以编程方式在发送 接收数据之间切换并只为 Android 手机充电 我知道你不能同时做这两件事 而且 因为你必须打开一个FileIn
  • NSUserDefaults 有哪些限制?

    在 iPhone 中永久存储数据通常是使用 Core Data 或 sqlite3 完成的 大多数人更喜欢使用 NSUserDefaults 作为应用程序首选项的存储 而不是将其用作普通数据库 例如 sqlite 我发现 NSUserDef
  • Charts Pod 未降级

    我正在使用 Xcode 8 3 和 swift 3 为了使用图表库 我需要使用 Charts 3 0 2 但 Cocoapods 始终安装最新的库 我尝试执行以下命令 pod install pod update but none are
  • 以编程方式将活动指示器添加到视图[重复]

    这个问题在这里已经有答案了 可能的重复 在应用程序启动期间显示活动指示器 https stackoverflow com questions 6849072 show activity indicator during applicatio
  • 如何在Firebase Android中24小时内每次更新一个值

    我有一个值在特定任务完成后设置为 1 但我希望在任务完成后 24 小时后将其设置回 0 为了解决这个问题 我建议您使用Firebase 的云功能 https firebase google com docs functions Cloud
  • 如果 !ModelState.IsValid 则复选框选中值丢失

    我在这里的方法可能完全错误 但我正在慢慢学习 MVC 我有一个表单 用户必须根据此模型选择多个 或不选择 模块 public class MyProductModule public string ModuleName get set pu