使用复选框绑定到具有强类型 MVC 视图的布尔列表列表字典

2023-11-27

我正在使用 MVC 4、.Net 4 和 Visual Studio 2012。

我正在尝试将一个相当复杂的模型与我的观点之一结合使用,但在使其正确绑定方面遇到了严重的困难。

该模型用整数键和布尔列表列表值来包装字典。

基本上,搜索是对由整数指示的项目进行的,每个项目都有几个搜索词,对于每个词我们都有一个结果列表。我将结果显示在页面上,并且每个结果旁边都有一个复选框。对于每个结果,用户将通过选中该框来指示他们是否希望下一个操作完成某些操作。

目前,复选框正确显示,包括来自控制器的预设值,但是当我按下表单底部的提交按钮时,出现此错误:

Specified cast is not valid.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidCastException: Specified cast is not valid.

在我看来,这与使用字典有关,有人告诉我,字典作为模型效果不佳。我可能必须改变一些东西,但除非绝对必要,否则我宁愿不改变。似乎这里的某个地方可能有答案:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx, or asp.net mvc 中复杂类型的复选框列表, or 如何在 ASP.NET MVC 上为 GET 和 POST 操作绑定字典类型参数,但我在写完问题后发现了这些,但我还没有弄清楚,所以也许有人可以帮助我。

这是堆栈跟踪的顶部:

[InvalidCastException: Specified cast is not valid.]
   System.Web.Mvc.CollectionHelpers.ReplaceDictionaryImpl(IDictionary`2 dictionary, IEnumerable`1 newContents) +131

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +92
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +108
   System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +19
   System.Web.Mvc.CollectionHelpers.ReplaceDictionary(Type keyType, Type valueType, Object dictionary, Object newContents) +178

这是模型:

public class AutoResolveModel {
    public Dictionary<int, List<List<bool>>> SelectedResults { get; set; }

    public AutoResolveModel() {
        SelectedResults = new Dictionary<int, List<List<bool>>>();
    }
}

由于它可能相关,因此这是 ViewBag.iidToData 的结构,它保存要显示的结果:

In the controller action:

    var iidToData = new Dictionary<int, List<ItemSearchResult>>();
    ViewBag.iidToData = iidToData;

Elsewhere:

    public class ItemSearchResult {
        public string C { get; set; }
        public string S { get; set; }
        public List<int> Ss { get; set; }
        public List<int> Ks { get; set; }
    }

以下是视图中的一些相关部分,其中变量名称已更改以保护无辜者:

@model AutoResolveModel

@{
    string machineID;
    Submission subm;
    tblSignatures sig;
    ItemSearchResult result;

    var dc = new CloudDataContext();
}

@using( Html.BeginForm( "MyAction", "MyController", new { p = (int?) ViewBag.l }, FormMethod.Post ) ) {

    foreach( KeyValuePair<int, List<ItemSearchResult>> kv in ViewBag.iidToData ) {

        <input type="hidden" name="@("SelectedResults[ " + kv.Key + " ].Key")" value="@kv.Key" />

        ID = (
            ...
        ).Single();

        <h3>Inventory Item @ID</h3>

        for(int isr = 0; isr < kv.Value.Count(); isr++) {

            result = kv.Value[ isr ];

            <h4>Searched for @result.S from @result.C</h4>

            <table border="0">
                <tr><th>K</th><th>I</th><th>V</th><th>G</th><th>D</th><th>S</th><th>T</th></tr>
                @for( int i = 0; i < result.Ks.Count(); i++ ) {
                    subm = (
                        ...
                    ).FirstOrDefault();
                    try {
                        sig = (
                            ...
                        ).Single();
                    } catch {
                        sig = null;
                    }

                    if( subm != null && subm.K != 0 ) {

                        <tr>
                            <td>@Html.CheckBoxFor(m => m.SelectedResults[kv.Key][isr][i])</td>
                            <td>@result.Ks[ i ]</td>
                            <td>@subm.i</td>
                            <td>@subm.v</td>
                            <td>@subm.g</td>
                            <td>@subm.d</td>
                            @if( sig != null ) {
                                <td>@sig.S</td>
                                <td>@sig.T</td>
                            } else {
                                <td>N/A</td>
                                <td>N/A</td>
                            }
                        </tr>
                    }
                }
            </table>
        }
    }

    <button type="submit">Search</button>
}

好吧,我明白了。

我尝试使用 Tuple>> 而不是 Dictionary>> 。那失败了,显然是因为 Tuple 没有 0 参数构造函数。

然后,我尝试使用具有两个属性的自定义类:一个 int 和一个 List>。经过一番摆弄之后,我让它开始工作,一旦工作成功,我就能够对其进行逆向工程,并使字典开始工作。

这是工作版本(与以前相同的视图模型和 iidToData):

...

@{
    string machineID;
    Submission subm;
    tblSignatures sig;
    ItemSearchResult result;

    int kvInd = 0;

    var dc = new CloudDataContext();
}

...

foreach( KeyValuePair<int, List<ItemSearchResult>> kv in ViewBag.iidToData ) {

    ...

    <input type="hidden" name="@("Model.SelectedResults[" + kvInd + "].Key")" value="@kv.Key" />

    for(int isr = 0; isr < kv.Value.Count(); isr++) {

        ...

        @if(result.Keytbls.Any()) {

            for( int i = 0; i < result.Keytbls.Count(); i++ ) {

                ...

                <td>@Html.CheckBox( "Model.SelectedResults[" + kvInd + "].Value[" + isr + "][" + i + "]",  Model.SelectedResults[ kv.Key ][ isr ][ i ] )</td>

                ...

        } else {
            <tr><td><input type="hidden" name="@("Model.SelectedResults[" + kvInd + "].Value[" + isr + "]")" /></td></tr>
        }

        ...
    }

    kvInd++;

}

...

因此,字典键的隐藏输入上使用的索引不是键,而是键值对的枚举,第 0 个、第 1 个、第 2 个,依此类推。这与稍后用于指示值的索引相同。

这引出了另一个有趣的部分。复选框的名称需要包含 Model.DictionaryName[enumerationIndex].Value 以指示我们正在为该索引的 KeyValue 对设置值。

此外,该辅助函数生成的 html 输入元素的值始终为 true,而第二个隐藏输入的值始终为 false。 “checked”属性指示输入复选框的值是否发送到默认绑定器,即它是否获取“true、false”值或仅“false”值。然后绑定器将其正确解释为布尔值。

最后,最后的 else 块中的隐藏输入为没有匹配搜索结果的条目添加一个空 List> 。 .Value 与之前的 .Key 配对,指示要添加到字典中的完整 KeyValue 对。然后,当绑定器看到 Model.Dictionary[index].Value[index] 而没有看到 Model.Dictionary[index].Value[index][index] 时,它会创建一个空列表,但不会添加任何值。

所以这不必要地复杂,但现在希望其他人可以在他们的 ViewModel 中使用带有 Collection 值的字典。

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

使用复选框绑定到具有强类型 MVC 视图的布尔列表列表字典 的相关文章

  • EXC_BAD_ACCESS 在使用 Swift 字典评估 NSExpression 后更新它时

    我正在使用字典来评估表达式 当表达式有变量并且字典实际上由 NSExpression 使用时 会发生一些事情 并且在尝试更新字典时我得到 EXC BAD ACCESS 这仅在 iPhone6 中调试时发生 而不是在模拟器而不是 iPhone
  • 连接尝试失败,因为连接方未正确响应

    我在 1and1 上有一个共享服务器 在我的 MVC 站点中 当我尝试连接到外部的另一台服务器时 出现以下错误 发送请求时发生错误 无法连接到 远程服务器连接尝试失败 因为连接方 一段时间后没有正确回应 或建立 连接失败 因为连接的主机未能
  • python 文件中的单词分析和评分

    我正在对一个句子进行逐字分析 例如 嘿那里 这是一部很棒的电影 我有很多像上面这样的句子 我有一个巨大的数据集文件 如下所示 我必须快速查找该单词是否存在 如果是 则进行分析并存储在字典中 例如从单词的文件中获取分数 句子最后一个单词的分数
  • ASP.NET Core/MVC 6 ViewModel 中的依赖注入 (DI)

    我使用构造函数注入在控制器中成功使用了 ASP NET 5 MVC 6 DI 我现在有一个场景 我希望我的视图模型在实现 IValidatableObject 时在 Validate 方法中使用服务 ViewModel 中的构造函数注入不起
  • 在Python中将字符串转换为字典或列表?

    在Python中将此字符串转换为列表或字典 u f i r s t n a m e u j o h n u l a s t n a m e u s m i t h u a g e 2 0 u m o b
  • 如何访问数据框中的一行嵌套字典

    我有一个 json 文件 如下所示 file name main question no Q 1 question what is answer user John comment It is defined as value number
  • mvc 登录尝试失败后生成验证码

    所以我能够让我的验证码工作正常工作 但我的问题是 我想让它只在 3 次尝试后出现 我的一个选择是将用户重定向到一个已经有验证码的视图 重复登录 但带有验证码 然后让他通过该页面登录 还有其他选择吗 我觉得部分视图会导致页面发布出现问题 您认
  • 实体类型 ApplicationUser 不是当前上下文模型的一部分。在项目开始时使用了两个不同的数据库

    我使用实体框架创建了一个 MVC 4 应用程序来读取数据并将数据写入我在 Azure 数据库上托管的数据库 Azure 数据库应该保存应用程序数据和应用程序的登录数据 但是 当我第一次创建应用程序时 我忘记删除到本地计算机的连接字符串 因此
  • _Layout.cshtml无法直接请求,因为它调用了“RenderBody”方法

    我使用属性来路由 这是否相关 我不知道 当我不使用 Route 属性时 共享控制器中的 Layaout 操作不起作用 但页面正在呈现 public class SharedController Controller GET Shared A
  • MVC3 TextBoxFor 带有编码文本

    有没有办法将 TextBoxFor 助手与编码文本一起使用 例如 当使用 MVC3 With Razor 视图引擎的以下帮助程序时 Html TextBoxFor model gt model Description 并且对 model D
  • C# SMTP 身份验证失败,但凭据正确

    这是我的问题 我编写了以下程序来测试是否可以发送电子邮件 class Program static void Main string args try Console WriteLine Mail To MailAddress to new
  • ASP.NET MVC 显示配置文件中的用户名

    以下是LogOn来自 Visual Studio 创建的标准默认 ASP NET MVC 项目的用户控件 登录用户控件 ascx Welcome b b
  • asp.net mvc 它能处理所有请求吗? - iis 7集成模式

    我有一个使用 asp net mvc 构建的网站 在 IIS 7 上使用集成模式运行 我注意到 当我输入 mysite com test html 时 我得到了 The IControllerFactory did not return a
  • 如何为客户端和服务器缓存设置不同的缓存过期时间

    我想让某些页面为客户端提供 10 分钟缓存 为服务器提供 24 小时缓存 原因是如果页面发生变化 客户端将在 10 分钟内获取更新版本 但如果没有任何变化 服务器只需每天重建一次页面 问题在于输出缓存设置似乎覆盖了客户端设置 这是我的设置
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • AutoMapper.Mapper 不包含 CreateMap 的定义

    这可能是一个基本问题 但想知道我没有得到 AutoMapper Mapper CreateMap 方法 我使用了错误的 AutoMapper 参考 包吗 谢谢 静态版本CreateMap方法在 4 2 中已弃用 然后在版本 5 0 中从 A
  • PostAsync 方法的 HttpClient 错误

    使用 HttpClient 对第 3 方 API 进行 PostAsync 调用时 当我执行 client PostAsync 时 我正好看到此错误 知道是什么原因造成的吗 Code public class JobController A
  • 传入字典的模型项是类型

    我有一个我理解的错误 但无法找出以正确的方式解决的方法 我有一个 MasterPage 我从该 MasterPage 中调用 标签是一个强类型视图 如下所示 我像这样返回 PartialView return View Tags resul
  • ASP.NET MVC 子操作的路由匹配

    子动作的路由匹配方法与普通动作有什么不同吗 换句话说 子操作是否有一些自动生成的 url 来进行与父操作类似的匹配 父级或子级动作处理没有区别 任何操作都遵循您在中设置的相同路线定义Application Start 这意味着父母的行为以及
  • ASP.NET MVC 和 Expression XAML - 如何集成?

    一些背景 ASP net MVC 主要是构建和开发 ASP NET 应用程序方式的范式转变 从 代码隐藏 类型的心态转变为更像标准 MVC Ruby on Rails 的心态 我赞扬它作为一种简化工具来简化单元测试和代码分离 尽管 html

随机推荐

  • Windows 7 任务栏图标突出显示颜色

    谁能解释当鼠标悬停在任务栏项目上时 如何根据 Windows 7 任务栏等图像中的主色计算突出显示颜色 有c 代码吗 我相信它的作用是使用类似于以下的方法来获取应用程序图标中最突出的颜色 Python 查找图像中的主要 最常见颜色 有了这些
  • Linux 何时/如何将共享库加载到地址空间?

    程序中什么时候指定共享对象的地址 链接期间 加载中 如果我想找到的内存地址system里面的命令libc在我的程序中我可以轻松找到它gdb 但是如果我不想将程序带入调试器怎么办 这个地址在不同的运行中会改变吗 是否有任何其他静态分析工具可以
  • 在 Web Api 2 中启用会话[重复]

    这个问题在这里已经有答案了 我知道 REST 应该是无状态的 我的 Web Api 与我的 MVC 网站位于同一项目中 我如何在他们之间共享会话 我正在尝试使用 Web Api 2 的优点并使用 Ajax 而不是构建 RESTful API
  • 中的虚线描边

    我想不可能设置像 CSS 这样的描边属性 这很容易 对于 CSS 我们有虚线 点线 实线 但在画布上绘制线条 或笔划时 这似乎不是一个选项 您是如何实施的 我看过一些例子 但它们真的很渴望这样一个愚蠢的功能 例如 http groups g
  • 如何使正则表达式模式优先于另一个模式

    我正在使用正则表达式来提取大学名称 主要观察到两种模式 某个名字 大学 gt 例如 安娜大学 某物 大学 gt 例如 埃克塞特大学 为此 我编写了两种模式 regex re compile join r Uu niversity of w
  • Swift:如何解决“协议”类型的弱变量非法的问题

    在阅读了有关此问题的一些帖子后 我发现我的协议应该继承自 class 以便 weak 能够处理我的委托变量 weak 只能应用于类或类绑定协议类型 如果我的协议不继承自 类 那么 swift 是否会 推断 它应该是弱的 这是将 协议 类型的
  • 当 Bean Validation 抛出 ConstraintViolationException 时自定义 JAX-RS 响应

    Bean 验证是验证对象的一个 不错的选择 但是当ConstraintViolationException被抛出 例如 POST Path company Consumes application json public void save
  • 优化 Lua 的循环执行

    我每 10 毫秒的程序周期执行一次 Lua 脚本 使用相同的 Lua state luaL newstate 在我的应用程序中调用过一次 调用 luaL loadbuffer 肯定会非常快地编译脚本 但似乎没有必要在每次执行脚本时都这样做
  • 函数名称在 bash 中有效,但在 sh 中无效 [重复]

    这个问题在这里已经有答案了 在使用 bash 和 sh 时 我发现以下内容在 bash 中有效 system out println printf 1 但不是在 sh 中 sh system out println not a valid
  • 如何使用 Java 设置 DynamoDB 返回的匹配项的限制?

    在我的 Android 应用程序中 我想从 DynamoDB 查询数据 将会有一千个匹配的项目 但我只想获得其中的前 10 个 我不知道如何设置这个限制 我在文档中找到了这些行 DynamoDB 查询和扫描 API 允许使用限制值来限制结果
  • 忽略转义序列 C++

    我尝试搜索谷歌但找不到答案 谁能告诉我如何忽略存储在 string 中的转义字符 我正在使用一个包含不同字符的数组 如下所示 string str 来自编译器的错误消息 未知转义序列 位于 As Zac has already pointe
  • Inno 设置部分 [Run] 带条件

    我的病情需要帮助 Run 如果它是可能的 我需要运行取决于条件的命令 像这样 if UserPage Values 0 NC then FileName sys inetsrv appcmd exe Parameters set 或者其他方
  • 最大还是默认?

    从可能不返回行的 LINQ 查询获取最大值的最佳方法是什么 如果我只是这样做 Dim x From y In context MyTable Where y MyField value Select y MyCounter Max 当查询未
  • 使用 Python 将流写入 Google Cloud Storage

    我正在尝试迁移AWS Lambda函数写在Python到 CF 那个 即时解压缩并逐行读取 对每条线执行一些灯光变换 将未压缩的输出 一次一行或块 写入 GCS 输出 gt 2GB 但略小于 3GB 因此适合Lambda just 嗯 这似
  • Resttemplate表单/多部分:POST中的图像+ JSON

    我正在尝试调用一个rest ws 使用resttemplate 它接受图像和一些JSON 但是 我似乎无法让它运行 相关代码如下 HttpHeaders header new HttpHeaders header setContentTyp
  • Python 将轴上的日期转换为月份

    我有一个时间序列 我想逐年绘制 我希望数据是每日的 但轴将每月显示为 一月 二月 等 目前我可以获得每日数据 但轴是 1 366 一年中的某一天 或者我可以将每月轴设置为 1 2 3 等 通过将索引更改为 df index month 但数
  • 如何在 Next.js 静态站点生成中获取 URL 查询字符串?

    我想从 Next js 静态站点生成的 URL 获取查询字符串 我在 SSR 上找到了一个解决方案 但我需要一个用于 SSG 的解决方案 Thanks import useRouter from next router import use
  • C# 部署我的应用程序 - 仅从 Web 单击一次

    所以我用 C 开发了我的应用程序 我已准备好部署它 我想让用户始终从我的网站启动它 以便他们始终获得更新 无需安装等 ClickOnce 是执行此操作的正确方法吗 我尝试将 ClickOnce 部署到我的服务器上 但我发现了一些事情 1 用
  • 开源 Telnet Java API

    是否有适用于 Java 的开源 telnet API 库 例如 Python telnetlib 我需要使用 telnet 连接到服务器并从 Java 程序中执行一些命令 我更喜欢使用 Apache Commons Net 库 http c
  • 使用复选框绑定到具有强类型 MVC 视图的布尔列表列表字典

    我正在使用 MVC 4 Net 4 和 Visual Studio 2012 我正在尝试将一个相当复杂的模型与我的观点之一结合使用 但在使其正确绑定方面遇到了严重的困难 该模型用整数键和布尔列表列表值来包装字典 基本上 搜索是对由整数指示的