将收集数据从 HTML/Razor 表单发送/发布到 MVC 操作参数模型

2023-12-08

我正在开发一个项目,使用 ASP.NET MVC 5 帮助学生和顾问选择下学期的最佳课程。第一步是让学生从列表中选择他已经选修的课程。显示列表的控制器是:

public ActionResult AddCourseVM (int? id)
    {
        Student student = db.Students.Find(id);
        // List<BaseCourse> potentialCourses = student.StudentConcentration.RequiredCourses.ToList();
        List<BaseCourse> potentialCourses = db.BaseCourses.ToList();
        AddCourseViewModel vModel = new AddCourseViewModel(student, potentialCourses);

        List<Course> listCourses = new List<Course>();

        foreach(BaseCourse baseC in potentialCourses)
        {
            Course c = new Course();
            c.BaseCourse = baseC;
            c.Student = student;
            listCourses.Add(c);
        }

        vModel.PossibleCourses = listCourses;

        return View("AddCourseVM", vModel);
    }

视图模型是:

public class AddCourseViewModel
{
    public Student Student { get; set; }
    public List<BaseCourse> AvailCourses { get; set; }
    public List<Course> PossibleCourses { get; set; }

    public AddCourseViewModel(Student s, List<BaseCourse> c)
    {
        Student = s;
        AvailCourses = c;
        PossibleCourses = new List<Course>();
    }

    public AddCourseViewModel()
    {
        Student = new Student();
        AvailCourses = new List<BaseCourse>();
        PossibleCourses = new List<Course>();
    }
}

课程对象是课程的特定实例(对于给定学生、某个学期等),基础课程对象是课程目录中的各个课程。

我使用此视图在列表中显示可能的课程:

    @model CMPSAdvising.ViewModels.AddCourseViewModel
@{
    ViewBag.Title = "AddCourseVM";
}

<h2>Add Courses</h2>

<div>
    <p>Name: @Model.Student.FirstName @Model.Student.LastName</p>
    <p>W#: @Model.Student.WNumber</p>
</div>

<div>
        <p>Select the Courses You Have Taken</p>
</div>
<div>
    @using (Html.BeginForm("AddCourseVM","Students"))
    {
        @Html.AntiForgeryToken();
        <div>
            <table class="table table-bordered">
                <tr>
                    <th>Course</th>
                    <th>Department</th>
                    <th>Number</th>
                    <th>Check if Taken</th>
                    <th>Semester</th>
                    <th>Grade</th>
                </tr>
                @foreach (var course in Model.PossibleCourses)
                {
                    <tr>
                        <td>@course.BaseCourse.Name</td>
                        <td>@course.BaseCourse.CourseNumber</td>
                        <td>@course.BaseCourse.CourseNumber</td>
                        <td>@Html.CheckBoxFor(s => course.Selected)</td>
                        <td>@Html.TextBoxFor(m => course.Semester)</td>
                        <td>@Html.TextBoxFor(g => course.Grade)</td>
                    </tr>
                }
            </table>
            <input type="submit" value="Save Classes Taken" class="btn btn-default" />
        </div>
    }
</div>

最后,当用户点击按钮时接收 POST 的控制器:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AddCourseVM (AddCourseViewModel vModel)
    {
        Student stu = vModel.Student;
        foreach (Course c in vModel.PossibleCourses)
        {
            if (c.Selected)
            {
                stu.CoursesTaken.Add(c);
            }
        }

        db.Entry(stu).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("ListTakenCourses", new { id = stu.ID });
    }

我的问题是 AddCourseViewModel 对象 (vModel) 返回 null。我想从网页中获取 ViewModel 作为对象,或者至少获取已检查的课程列表和学生 ID。


我相信有一个名为 BeginCollectionItem HtmlHelper 的应用程序. It is 在这里简要讨论参考文献,并且基于史蒂夫·桑德森几年前写的博客文章.

问题在于,与表单集合的模型绑定与 MVC 中与标量输入的模型绑定并不完全相同。您的收藏需要一个索引器,正如这里所讨论的。如果它没有按预期绑定,请检查呈现的表单输入的名称属性,并将它们与后模型(操作参数)类中的属性名称和结构进行比较。

从表面上看,看起来更像这样的 HTML 输出应该会导致操作参数不为空:

<tr>
    <td>HTTP 101</td>
    <td>HTP-101</td>
    <td>HTP-101</td>
    <td><input type="checkbox" name="PossibleCourses[0].Selected" /></td>
    <td><input type="text" name="PossibleCourses[0].Semester"></td>
    <td><input type="text" name="PossibleCourses[0].Grade"></td>
</tr>
<tr>
    <td>MVC 101</td>
    <td>MVC-101</td>
    <td>MVC-101</td>
    <td><input type="checkbox" name="PossibleCourses[1].Selected" /></td>
    <td><input type="text" name="PossibleCourses[1].Semester"></td>
    <td><input type="text" name="PossibleCourses[1].Grade"></td>
</tr>

...等等,以下剃刀应输出:

@for (var i = 0; i <= Model.PossibleCourses.Count; i++)
{
    var course = Model.PossibleCourses[i];
    <tr>
        <td>@course.BaseCourse.Name</td>
        <td>@course.BaseCourse.CourseNumber</td>
        <td>@course.BaseCourse.CourseNumber</td>
        <td>@Html.CheckBox(string.Format("PossibleCourses[{0}].Selected", i),
            course.Selected)</td>
        <td>@Html.TextBox(string.Format("PossibleCourses[{0}].Semester", i),
            course.Semester)</td>
        <td>@Html.TextBox(string.Format("PossibleCourses[{0}].Grade", i),
            course.Grade)</td>
    </tr>
}

请注意表单输入元素的名称属性如何与可索引的名称相对应(List<Course>) 操作参数模型中的属性,以及索引的 (Course) 包含在集合内的属性名称。这是通过使输入名称属性与方法参数属性名称相匹配来帮助模型绑定器弄清楚如何使用数据填充操作参数类实例的一种方法。

您还可以使用 GUID(或任何与此相关的字符串)作为索引器,这就是 BeginItemCollection 内部所做的事情。以下内容还应该帮助模型绑定器能够填充操作参数,以便它不会作为 null 进入操作方法:

@foreach (var course in Model.PossibleCourses)
{
    var indexer = Guid.NewGuid(); // or possibly course.CourseId
    <tr>
        <td>@course.BaseCourse.Name</td>
        <td>@course.BaseCourse.CourseNumber</td>
        <td>@course.BaseCourse.CourseNumber</td>
        <td>@Html.Hidden("PossibleCourses.index", indexer)
            @Html.CheckBox(string.Format("PossibleCourses[{0}].Selected", indexer),
            course.Selected)</td>
        <td>@Html.TextBox(string.Format("PossibleCourses[{0}].Semester", indexer),
            course.Semester)</td>
        <td>@Html.TextBox(string.Format("PossibleCourses[{0}].Grade", indexer),
            course.Grade)</td>
    </tr>
}

重要的是与操作参数类中的集合项对应的每组表单元素必须共享相同的索引器,并且该索引器必须与与操作参数类中的不同集合项对应的其他表单元素组不同。该解决方案的示例可以通过以下方式理解阅读这个问题及其答案.

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

将收集数据从 HTML/Razor 表单发送/发布到 MVC 操作参数模型 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • matplotlib widgets Slider demo源码讲解

    我试图理解源代码能够使用 matplotlib 的滑块小部件 定义函数的代码段update 真的很困扰我 我不明白争论有什么意义val in def update val 以及值val没有在任何地方提到 这是同样的问题def reset e
  • 如何增加netbeans中的java堆大小?

    我正在尝试在 netbeans 中用 java 构建一个近 110000 个单词的词典 trie 我的代码运行良好 但出现异常 如下所示 Exception in thread main java lang OutOfMemoryError
  • 等待子窗口加载完成

    是否有一个简单的挂钩来检测脚本打开的窗口是否已完成加载 基本上 我想要相当于onLoad 钩子 但我无法直接设置它 假设子文档是给定的 并且我实际上无法在其中放入我自己的任何代码 例如 假设我有以下两个文件 parent html
  • 无法在不扰乱重力的情况下翻转球的方向

    我正在制作一款类似乒乓球的游戏 只不过只有一个球拍并且球以抛射运动移动 目标是让球尽可能长时间地在球拍上弹跳 当球被球拍击中时 y其速度分量的符号翻转 问题是重力也作用在球上 因此当球向上击打时 由于重力的反向作用 球会加速 这是球类的代码
  • 将 SORM 与 Play Framework 结合使用会导致引发反射异常

    我一直在尝试让 SORM 与 Play Framework 2 2 SNAPSHOT 以及 2 1 1 一起使用 目前 我正在尝试运行我创建的简约示例应用程序 以便更轻松地追踪问题 不幸的是 我收到的错误消息对我没有任何帮助 val app
  • Google Cloud Function - 错误:ENOENT:没有这样的文件或目录

    我正在尝试执行一个简单的功能来调整存储中新上传的图像的大小 我使用以下方法来帮助我做到这一点 import tmpdir from os import join dirname from path import as sharp from
  • OpenGL 着色器的显式与自动属性位置绑定

    当为 OpenGL 着色器程序设置属性位置时 您面临两个选项 glBindAttribLocation 在链接之前显式定义属性位置 or glGetAttribLocation 链接后获得自动分配的属性位置 使用其中一种比另一种有什么用处
  • 模拟过程中会话丢失

    我使用 SonataAdminBundle 并配置了sonata user in config yml sonata user impersonating route profile logged more config 我的管理面板位于
  • UITableview:如何禁用某些行而不是其他行的选择

    我正在组中显示tableview从 XML 解析的内容 我想禁用它的点击事件 我根本不应该点击它 该表包含两组 我只想禁用第一组的选择 而不禁用第二组的选择 单击第二组的第一行navigates到我的管子player view 如何才能只选
  • Android:ScrollView 内的 Listview

    我想要一个可以滚动的布局和其中的列表视图 列表视图将根据其中的项目数量扩展其高度 只有外面的ScrollView是可滚动的 这是我的代码
  • req.user 在 Google Passport 策略中不可用

    我有一个快速应用程序 它通过 Passport 管理身份验证 最初使用本地策略 为此 我刚刚添加了 Google 登录 帐户创建 几乎一切都按照文档进行 我遇到的问题是 用户可以使用 Google 策略创建帐户 但我无法完全理解它 以便经过
  • 如何路由 /About 到 /Home/About

    我刚刚开始使用 ASP NET MVC 这太棒了 但是 我不太明白设置路线 如何将 About 路由到 Home About 视图 主页 About aspx 我希望能够通过以下方式访问它 首页 关于要不就 About 如果你想明确地为其设
  • 预填充 Django 表单

    我试图从查询中获取 Django 表单 但我一直以错误的方式进行操作 检查了几个例子 但我做的有点不同 这是我的代码 Le Form class ItemForm ModelForm class Meta model Item exclud
  • 我可以通过多边形绑定 st_distance 调用吗?

    我看过关于这个主题的类似帖子 例如 here and here 但不是 sf tidyverse 生态系统特有的 I have a series of lakes a series of sample points within each
  • 在 Firebug 中查看 CSS 伪元素

    是否有任何解决方法可以查看 CSS 伪元素 例如 after before等 称为CSS3 生成和替换的内容模块 在萤火虫中 现在 当我选择一个元素时 我只能看到应用于它的静态 CSS 我没有看到使用样式应用于它 after and bef
  • ANSI 颜色集图形渲染在批次中中断并在继续后工作

    我有一个批处理 其中有一个子部分 该子部分迭代 EXE 文件的行以尝试运行 然后该批处理根据 EXE 的退出代码对 EXE 进行排序 由于某种原因 ANSI SGR 在设置前一个图形渲染而不是重新渲染后似乎会破坏或回显文字文本 我回去重新参
  • 如何对 pandas 数据帧上的最大和最小时间戳进行分组

    我想对数据集进行分组并返回最大和最小时间戳 这是我的数据 id timestamp 1 2017 09 17 10 09 01 2 2017 10 02 01 13 15 1 2017 09 17 10 53 07 1 2017 09 17
  • 如何激活全屏控制DOTS(SDK14)

    有人知道我的意思吗 在我的 Galaxy Nexus 上的新相机应用程序的全屏模式下 控制按钮变为 3 个点 我如何以编程方式激活它 您可以使用 getWindow getDecorView setSystemUiVisibility Vi
  • 使用 Jest 模拟命名导入

    我有一个 notifications js 模块 看起来有点像这样 import Notifications Permissions from expo export function setLocalNotification storag
  • 将收集数据从 HTML/Razor 表单发送/发布到 MVC 操作参数模型

    我正在开发一个项目 使用 ASP NET MVC 5 帮助学生和顾问选择下学期的最佳课程 第一步是让学生从列表中选择他已经选修的课程 显示列表的控制器是 public ActionResult AddCourseVM int id Stud