MVC 如何使用列表项 POST 操作方法传递对象列表

2023-11-27

我想从 Razor 视图将项目列表发布到控制器,但我得到的对象列表为 null 我的班级结构是

Model:

List<Subjects> modelItem

class Subjects
{
    int SubId{get;set;}
    string Name{get;set;}
    List<Students> StudentEntires{get;set;}
}

class StudentEntires
{
    int StudId{get;set;}
    string Name{get;set;}
    int Mark{get;set;}
}

模型本身是一个项目列表,每个项目也包含子项目列表。示例模型是一个科目列表,每个科目都包含一个学生列表,我想为每个学生输入分数

我的观点就像

@model IList<Subjects>  
@{   
   Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm())
{    
   @Html.ValidationSummary(true)
   if (Model.Count > 0)
   {
       @for (int item = 0; item < Model.Count(); item++)
       {
           <b>@Model[item].Name</b><br />
           @foreach (StudentEntires markItem in Model[item].StudentEntires)
           {
               @Html.TextBoxFor(modelItem => markItem.Mark)
           }
       }
       <p style="text-align:center">
           <input type="submit" class="btn btn-primary" value="Update" />
       </p>
    }
}

并在控制器中

    [HttpPost]
    public ActionResult OptionalMarks(int Id,ICollection<Subjects> model)
    {
        //BUt my model is null. Any idea about this?
    }

您会发现这很困难,因为您没有充分利用 MVC 框架的全部功能,因此请允许我提供一个工作示例。

首先,让我们创建一个视图模型来封装视图的数据需求:

public class SubjectGradesViewModel
{
    public SubjectGradesViewModel()
    {
        Subjects = new List<Subject>();
    }

    public List<Subject> Subjects { get; set; }
}

接下来,创建一个类来表示您的主题模型:

public class Subject
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Student> StudentEntries { get; set; }
}

最后,一个代表学生的类:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Grade { get; set; }
}

此时,您已经拥有了表示数据所需的所有类。现在让我们创建两个控制器操作,包括一些示例数据,以便您可以了解其工作原理:

public ActionResult Index()
{
    var model = new SubjectGradesViewModel();

    // This sample data would normally be fetched
    // from your database
    var compsci = new Subject
    {
        Id = 1,
        Name = "Computer Science",
        StudentEntries = new List<Student>()
        {
            new Student { Id = 1, Name = "CompSci 1" },
            new Student { Id = 2, Name = "CompSci 2" },
        }
    };

    var maths = new Subject
    {
        Id = 2,
        Name = "Mathematics",
        StudentEntries = new List<Student>()
        {
            new Student { Id = 3, Name = "Maths 1" },
            new Student { Id = 4, Name = "Maths 2" },
        }
    };

    model.Subjects.Add(compsci);
    model.Subjects.Add(maths);

    return View(model);
}

[HttpPost]
public ActionResult Index(SubjectGradesViewModel model)
{
    if (ModelState.IsValid)
    {
        return RedirectToAction("Success");
    }

    // There were validation errors
    // so redisplay the form
    return View(model);
}

现在是时候构建视图了,这部分在将数据发送回控制器时尤其重要。首先是Index view:

@model SubjectGradesViewModel

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    @Html.EditorFor(m => m.Subjects) <br />
    <input type="submit" />
}

你会注意到我只是使用Html.EditorFor,同时经过Subjects作为参数。我这样做的原因是因为我们要创建一个EditorTemplate代表一个Subject。稍后我会解释更多。现在,只知道EditorTemplates and DisplayTemplates是 MVC 中的特殊文件夹名称,因此它们的名称和位置很重要。

我们实际上要创建两个模板:一个用于Subject和一个用于Student。为此,请按照下列步骤操作:

  1. 创建一个EditorTemplates视图当前文件夹内的文件夹(例如,如果您的视图是Home\Index.cshtml,创建文件夹Home\EditorTemplates).
  2. 在该目录中创建一个强类型视图,其名称与您的模型相匹配(即在这种情况下,您将创建两个视图,称为Subject.cshtml and Student.cshtml,分别(同样,命名很重要))。

Subject.cshtml应该看起来像这样:

@model Subject

<b>@Model.Name</b><br />

@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.Name)
@Html.EditorFor(m => m.StudentEntries)

Student.cshtml应该看起来像这样:

@model Student

@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.Name)
@Html.DisplayFor(m => m.Name): @Html.EditorFor(m => m.Grade)
<br />

就是这样。如果您现在构建并运行该应用程序,请在POST索引操作,您将看到模型已正确填充。

那么,什么是EditorTemplates,以及他们的同行,DisplayTemplates?它们允许您创建视图的可重用部分,从而使您可以更多地组织视图。

它们的伟大之处在于模板化的助手,即Html.EditorFor and Html.DisplayFor,足够聪明,知道他们何时处理集合模板。这意味着您不再需要循环遍历项目,每次都手动调用模板。您也不必执行任何操作null or Count()检查,因为助手会为您处理这一切。你留下的观点是干净且没有逻辑的。

EditorTemplates当您想要将集合 POST 到控制器操作时,还会生成适当的名称。这使得模型绑定到列表比您自己生成这些名称简单得多。有时您仍然需要这样做,但这不是其中之一。

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

MVC 如何使用列表项 POST 操作方法传递对象列表 的相关文章

随机推荐

  • RecyclerView 滑动即可关闭 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我曾经滑动关闭库 但现在我正在尝试迁移到 RecyclerView 事情并不那么明显 你知道这个库有什么替代品吗 有什么想法如何从头开始实施吗 从
  • BoxDecoration 中的 FadeInImage

    我喜欢淡入图像 我可以做这个 child FadeInImage assetNetwork image https placeimg com 640 480 any placeholder assets images loading gif
  • 如何点击量角器中的隐藏元素?

    我有一个元素 只有当我将鼠标悬停在它上面时才可见 我编写了以下代码将鼠标悬停在面板上 以便该元素可见 ptor actions mouseMove ptor findElement protractor By xpath id produc
  • 安卓、摇篮。如何构建应用程序并从测试应用程序运行测试

    我里面有 android 项目和 android 测试项目 位于文件夹测试下 这些项目的结构类似于 eclipse src res 库 测试 我用的是gradle 我想要的只是构建应用程序 运行单元测试并获取它们的报告 但我不明白如何正确地
  • MATLAB parfor 中的版本或字节顺序错误?

    我正在使用 MATLAB 进行并行计算parfor 代码结构看起来很像 assess fitness save communication overheads bitmaps pop 1 new indi idices porosities
  • python list.pop() 修改原始列表(不仅仅是复制)

    情况 制作原始列表的副本后 我使用 pop 修改所述副本 事实证明 原始列表受到了更改的影响 我什至在检查原始列表和副本不是同一对象后 弹出副本的元素将弹出原始列表中的相同元素 请参阅下面的脚本示例 在此先感谢您的帮助 l 1412898
  • jQuery Mobile 固定页脚在键盘出现时移动

    我使用 Phonegap 和 jQuery Mobile 设计了一个应用程序 固定页脚可以正常工作 直到我单击下拉列表或文本字段 这会导致页脚从视图中消失 Android 4 0 或移动到视图中间 Android 2 2 Galaxy Ta
  • npm 将所有模块安装在 /usr/local/lib/node_modules/ 中

    我在 Ubuntu 12 10 上安装了 node js 0 8 14 我在主目录中创建了一个带有子目录的目录node modules 我想在那里安装一些本地节点模块但正在运行 npm install myModule 在此目录中安装此模块
  • 在 PHP 中如何检查类是否存在?

    所以我在主类中有这种结构函数 function construct this gt conf GLOBALS conf this gt dbi new dbinfo this gt modOpt new modOptions this gt
  • HTTP_HOST 的可靠性如何?

    我编写了一个 PHP 脚本 我想在同一服务器上的多个域上使用该脚本 指向相同的脚本 我想向脚本添加功能 以便我可以随时找出脚本正在使用的域 HTTP HOST 可用于查找域 但是 我读到它不可靠 尤其是对于较旧的浏览器 我的理解是大多数 A
  • 检查应用程序是否在测试环境中运行

    只是想知道我是否可以确定我的应用程序当前是否在测试环境中运行 原因是我正在运行自动屏幕截图 并且只想在运行该 UI 测试时隐藏 修改我的应用程序的部分内容 例如 我想跳过注册推送通知以避免在启动时出现 iOS 弹出窗口 我正在寻找类似的东西
  • java中引用变量的大小是多少[重复]

    这个问题在这里已经有答案了 java中引用变量的大小是多少 我很确定它不会依赖于架构 是吗 它与 C 中的指针概念有相似之处吗 我尝试过 但无法得到任何令人信服的答案 引用使用的内存量取决于几个参数 在 32 位 JVM 上 它将是 32
  • python 中的绝对导入不起作用,相对导入起作用

    我似乎无法在 python 中使用绝对导入 这是我的文件结构 a b init py init py foo py foo py Including or removing the future import has no effect f
  • 地理位置在 Windows 7/XP 上的 Safari 5.x 上不起作用

    我正在开发一个使用 W3C 标准地理定位 API 的应用程序 但我一生都无法让它在我的 Windows 7 和 XP PC 上的 Safari 上运行 它在我的 iPad 和 iPhone 上运行良好 它还可以在 Chrome 5 6 7
  • Swift 对象引用数组?

    我可能错过了有关 swift 的重要信息 我有一个包含键 快速数组对的地图 我更改了数组 但地图内的数组没有更改 有人可以解释一下发生了什么事吗 谢谢 var map String String var list String map li
  • 在 pandas 数据框中查找元素

    我有一个 pandas 数据框 如下所示 0 1 0 2 2 3 1 4 我想要做的是 如果我得到 2 作为输入 我的代码应该在数据框中搜索 2 当找到时 它返回另一列的值 在上面的示例中 我的代码将返回 0 和 3 我知道我可以简单地查看
  • 限制输入为数字和 。在输入字段上

    继我问的另一个问题之后 我似乎真的没有取得任何进展 由于我的无能 我选择了这些人的答案 因为他回答了我的问题 我正在收集我没有问正确的问题 因为我不知道该怎么做 所以问题是我有输入元素 保持简单
  • 企业防火墙/代理后面的 Firestore / gRPC

    我们公司已经使用 Firestore 构建了一个电子应用程序 现在我们正在尝试将该应用程序部署在公司代理和防火墙 客户环境 后面 使用电子设置代理身份验证设置后app on login 应用程序中的所有网络请求均成功 Firestore 连
  • mongoexport 语法错误消息

    我正在使用 mongodb 2 4 3 但无法让 mongoexport 工作 我收到的每个命令的错误消息是 JavaScript execution failed SyntaxError Unexpected identifier 起初我
  • MVC 如何使用列表项 POST 操作方法传递对象列表

    我想从 Razor 视图将项目列表发布到控制器 但我得到的对象列表为 null 我的班级结构是 Model List