如何使用 MVC 3 和 Entity Framework Code First 建立多对多关系的 ModelBind?

2023-12-06

我在 MVC 3 应用程序中遇到了同样的问题。我有一个创建新产品的视图,并且该产品可以分配给一个或多个类别。这是我的 EF Code First 模型类:

public class Product 
{
    public int ProductID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
}

public class Category 
{
    public int CategoryID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Product> Products { get; set; }
}

因此,我为创建产品视图创建一个视图模型,并包含产品和类别列表:

public class ProductEditViewModel
{
    public Product Product { get; set; }
    public List<SelectListItem> CategorySelections { get; set; }

    public ProductEditViewModel(Product product, List<Category> categories)
    {
        this.Product = product;
        CategorySelections = categories.Select(c => new SelectListItem()
        {
            Text = c.Name,
            Value = c.CategoryID.ToString(),
            Selected = (product != null ? product.Categories.Contains(c) : false)
        }).ToList();
    }
}

因此,我渲染一个视图,其中包含名称输入和每个类别的复选框列表(名为“Product.Categories”)。当我的表单被发回时,我想保存产品及其关联的类别(或者如果 ModelState 无效,则重新显示用户完整选择的类别的视图)。

[HttpPost]
public ActionResult Create(Product product)
{
    if (ModelState.IsValid)
    {
        db.Products.Add(product);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(new ProductEditViewModel(product, db.Categories.ToList()));
}

当我这样做并选择一个或多个类别时,ModelState 无效,它返回编辑视图,并显示以下验证错误:

值“25,2”无效。 // 25 和 2 是 CategoryID

对我来说,它不能将 25 和 2 绑定到实际的类别对象中,这是有道理的,但是是否有一种标准方法来使用自定义 ModelBinder,允许我将 ID 转换为类别并将它们附加到上下文?


你什么could尝试如下:绑定到您的 ViewModel 而不是Product在您的帖子操作中:

[HttpPost]
public ActionResult Create(ProductEditViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        foreach (var value in viewModel.CategorySelections
                                       .Where(c => c.Selected)
                                       .Select(c => c.Value))
        {
            // Attach "stub" entity only with key to make EF aware that the
            // category already exists in the DB to avoid creating a new category
            var category = new Category { CategoryID = int.Parse(value) };
            db.Categories.Attach(category);

            viewModel.Product.Categories.Add(category);
        }
        db.Products.Add(viewModel.Product);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(new ProductEditViewModel(
        viewModel.Product, db.Categories.ToList()));
}

我不确定这是否是“标准方式”。

Edit

The return模型无效的情况无法在上面的示例中工作,因为viewModel.Product.Categories集合为空,因此您不会在视图中获得选定的类别项目,也不会获得用户之前选择的项目。

我不知道你到底如何将集合绑定到视图(你的“复选框列表”?),但是当使用ListBox允许多项选择,那么似乎有一个类似于这个答案的解决方案:在 ListBoxFor 中选择值的挑战。我刚刚在评论中询问 Darin 所选项目 id 的列表是否也会在后操作中绑定到 ViewModel,他确认了这一点。

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

如何使用 MVC 3 和 Entity Framework Code First 建立多对多关系的 ModelBind? 的相关文章

  • MVC 3 Razor,具有自定义标记/部分的助手

    我什至不确定这是否可行 但我想我会检查一下是否有任何方法可以使这变得更容易 首先 我的网站中有一些重复的标记 如下所示 div class module h3 Title h3 div p Information goes here p d
  • LINQ 按降序排序,底部为空值 [重复]

    这个问题在这里已经有答案了 我有这样的表达 troubletickets db ServiceTickets Include t gt t Company Include t gt t UserProfile troubletickets
  • 为什么实体框架尝试选择所有列,即使我只指定了两列?

    我继承了一个 ASP MVC 项目 该项目使用 Entity Framework 6 1 3 与 Dynamics CRM 2011 SQL 数据库进行交互 我正在使用此查询来尝试获取具有帐号的所有活动帐户 并且我仅选择两列为匿名类型 va
  • AssociationSet 中的关系处于“已删除”状态

    我正在尝试在我的网站中创建新帖子 但由于某种原因 EF 抛出以下错误 来自 PostAttributeValue Definition 关联集的关系 处于 已删除 状态 给定多重约束 相应的 PostAttributeValue Defin
  • 如何使用 EF Code First 将一张表与多个父项关联

    我正在构建一个域模型 该模型需要多个表才能被多个可能的父表引用 像您可能有一个表来存储注释或文件 并且这些注释和 或文件可以与不同的父实体关联 并不是说同一个 文件 或 注释 可以与多个所有者相关联 而是 文件 表中的 10 行中 其中 3
  • Ninject:选择错误的构造函数

    我有一个带有 Ninject v2 2 1 4 的 ASP NET MVC 3 应用程序 一切都运行良好 然后突然我们开始看到 Ninject 尝试使用带有参数的构造函数而不是无参数构造函数来创建 DbContext 以下是绑定 kerne
  • 使用 DI 将参数传递给 DbContext

    我想向 DBContext 传递一个附加参数 如下所示 string myParam xx string con connenctionstring services AddDbContext
  • 如何设置 web.config 文件以显示完整的错误消息

    我在 Windows Azure 上部署了 MVC 3 应用程序 但现在当我通过请求时staging url它告诉我 很抱歉 在执行您的要求时发生了一个错误 现在我想查看完整的错误消息 默认情况下由于某些安全原因它会隐藏该消息 我知道我们可
  • MVC 下拉列表未映射到模型

    我正在尝试使用 EF codefirst 在 MVC 3 中开发应用程序 当我使用 int 属性和约定来设置外键关系时 例如 public class Patient public int ConsultantId get set 然后 我
  • 使用更新的值重新加载实体框架上下文中的对象

    我有一个从数据库中提取的 EF 对象 然后 我通过使用另一个函数调用来更新数据库中的相应行DBContext 在此更新之后 我想使用更新后的内容重新加载对象的内容 但是 EF 上下文似乎缓存了这些内容 这是代码示例 我删除了一些不相关的内容
  • MVC3 中的角色管理

    我想向应用程序添加一项功能 以便只有管理员才能创建用户 并且他可以向用户提供对特定页面的访问权限 他可以创建角色 可以为用户提供不同的角色 我正在使用 Visual Studio 2010 并在 MVC3 中构建此应用程序 请给我建议来弥补
  • VS 2012 中缺少实体数据模型

    添加新项目时 我在 数据 选项卡下找不到实体数据模型 我查看了几个问题和答案以及有关此问题的信息 但没有一个解决方案有效 我已修复 卸载并重新安装 手动安装 EF Tools 包并尝试卸载所有 VS 相关程序 我还尝试在不同的 NET 框架
  • 你把你的验证放在 asp.net mvc 3 的哪里?

    ASP NET MVC 中一种常见的推荐做法是您不应该将您的商业模式发送到您的视图中 http lostechies com jimmybogard 2009 06 30 how we do mvc view models 相反 您应该创建
  • ASP.NET MVC3:WebGrid + Ajax 过滤器 + Ajax 排序和分页

    基本上 我正在使用 WebGrid 并且需要过滤结果 我遇到的第一个问题是 这是我第一次使用 WebGrid 我希望你们中的一些人能够帮助我 到目前为止 我已经设法对网格结果进行排序并使用 Ajax 过滤它们 但是 当重新排序过滤后的结果
  • 使用 linq 2 实体检查 where 子句的两个条件

    嗨 我有一个名为 产品 的表 其中包含列 product id prodcut name prodcut price values like 1200 2000 3000 100 prodcut desc category id 1 2 3
  • 如何在 Entity Framework 4.4 中实现 DBSet.AddOrUpdate?

    回应 Slauma 对我的问题的回答关于在 Windows XP 上运行使用 EF 的应用程序 https stackoverflow com questions 17963417 can i implement entity framew
  • 每 4 个循环新表行

    如何在 Razor 视图中每 4 个循环创建一个新表行 这是为 4 之前的每个数字创建一个新行 然后停止创建新行 int i 0 foreach var item in ViewBag ProgramIdList if i 4 0 tr t
  • 抑制实体框架核心中的 SQL 查询日志记录

    我有一个使用实体框架核心的控制台 net core 应用程序 该应用程序使用日志框架写入文件和控制台 serviceProvider new ServiceCollection AddLogging AddDbContext
  • 将大量实体插入 SQL Server 2012 [重复]

    这个问题在这里已经有答案了 我正在进行一个使用 Entity Framework 5 和 SQL Server 2012 的项目 我们需要一次插入大量行 100k 个实体的顺序 基本上 我们有一个物理程序 它输出大量二进制数据 然后我们需要
  • WinForms 中的 EF:如何过滤 BindingSource/DGW 中的数据 (.Local.ToBindingList())

    我按照本教程生成了 EF 模型 首先是数据库 和数据源http msdn microsoft com en us data jj682076 aspx http msdn microsoft com en us data jj682076

随机推荐

  • 删除名称以特定字符串开头的所有表

    如何删除名称以给定字符串开头的所有表 我认为这可以通过一些动态 SQL 来完成INFORMATION SCHEMA tables 如果数据库中有多个所有者 您可能需要修改查询以包含所有者 DECLARE cmd varchar 4000 D
  • 为 WebGL 示例嵌入 ChakraHost (c#)

    我研究了涉及嵌入 javascript 框架 paper js 的示例 用于通过 ChakraHost 的 JsBridge 实现将输出绘制到 XAML 的 CanvasControl 要包含 paper js 框架和调用该框架的 java
  • ValueError: check_hostname 需要使用 Fiddler 4 的 server_hostname

    This question最近刚刚发布的有一些有用的答案 但与我的不一样 我正在从 ArcGIS Pro Notebook 运行 urllib3 1 26 4 和 Python 3 7 我还打开了 Fiddler 4 因为我想在对脚本进行故
  • 当我的编译器不符合标准时如何将数组成员归零

    我的编译器 C Builder6 在语法上允许数组成员初始化 至少为零 但实际上它并没有真正做到这一点 因此 下面给出的示例中的断言会失败 具体取决于上下文 include
  • 导航到新页面并显示警告框

    我正在使用 ASP Net WebForm 开发一个应用程序 一旦用户单击按钮 应用程序将导航到新页面并提示对话框 欢迎来到 JackiesGame 但是 我能够导航到新页面 但不显示警报对话框 以下是我的示例代码 void cmdCanc
  • PHP 中简单干净的 xml 操作

    我正在尝试寻找一种在 php 中轻松修改 xml 的方法 PHP 文档对于如何轻松操作 xml 非常令人困惑 我喜欢 SimpleXml 如何轻松查找标签 属性 但它似乎不允许您轻松添加子树或替换现有的子树 关于使用什么有什么建议吗 我的用
  • 为什么jstl的formatNumber货币符号区域设置在设置currencyCode时是特定的

    我使用 formatNumber 如下
  • ViewChild 和 ContentChild 的有效选择器是什么?

    我正在寻找可用于访问子组件 DOM 元素的有效选择器的完整列表 ViewChild and ContentChild 说我有孩子HelloComponent 我知道我可以添加模板 ref并查询它 如下所示
  • chrome webrequest api url 数组?

    这是一个非常简单的 Chrome 扩展程序的代码 该扩展程序可以阻止手动指定的网站 chrome webRequest onBeforeRequest addListener function details return cancel t
  • 如何国际化/本地化 JSP/Servlet Web 应用程序?

    我从谷歌了解到 国际化是我可以使自己的 Web 应用程序使用所有语言 我想了解Unicode国际化的过程 所以我从here and there 我能够理解 Unicode 即字符集如何编码为字节 然后又如何将字节解码为字符集 但我不知道如何
  • android - CursorAdapter中两个视图布局的bindView和newView

    故事是这样的 我想在我的适配器中使用两种布局 所以基本上 我需要在 newView 中有一个 if 来确定要返回哪个视图 并在 bindView 中有一个 if 来知道在视图中做什么 这是正确的方法吗 我在想这样的事情 Override p
  • mysqli::bind_param();变量

    mysqli new mysqli localhost my user my password world check connection if mysqli connect errno printf Connect failed s n
  • 将位图转换为 ASCII 艺术图

    这样的图像转换算法是如何工作的 我想将位图转换为 ASCII 艺术 谁能帮我看看我应该使用哪种算法 W W W W W W W W W WW WW WW W WW WWW WW W W WW WWW WW W
  • JQuery jquery-1.7.1.min.js live() 不推荐使用 on()

    来自 jQuery 网站 从 jQuery 1 7 开始 live 方法已被弃用 使用 on 来 附加事件处理程序 在 1 7 1 版本中 我尝试将所有 live 更改为 on 但没有成功 有谁知道为什么吗 这就是它的调用方式 这是不起作用
  • Google Android GCM 未注册错误

    我正在使用 Android GCM Push 服务 它在一段时间内工作得很好 但在这段时间里它失败了 这是详细信息 如果我让我的应用程序空闲一段时间 然后服务器突然从 Google GCM 获得 NotRegistered 响应 这很奇怪
  • 回形针在哪里放置丢失的.png 默认图像?

    我在我的应用程序中使用回形针 但我的控制器测试失败 因为 BlogsControllerTest test should update blog Paperclip AdapterRegistry NoHandlerError No han
  • 使用 C# 命令 netsh

    我想创建一个 C 应用程序来创建 WLAN 网络 我目前使用命令提示符使用 netsh 我的应用程序应该通过单击按钮来执行此操作 这是我在管理模式下的命令提示符中使用的命令 netsh wlan set Hostednetwork mode
  • 按组生成排名

    如何根据标记在数据框中创建排名 但排名应根据性别分开 Sl no Name Gender Marks Rank 1 aa Male 77 3 2 bb Female 80 2 3 cc Male 74 4 4 dd Female 72 5
  • 如何在 CollapsingToolbarLayout 中使用 TabLayout 和 Toolbar?

    我正在看克里斯班斯 奶酪广场我试图将带有工具栏的 TabLayout 放入 CollapsingToolbarLayout 中 这是我的代码
  • 如何使用 MVC 3 和 Entity Framework Code First 建立多对多关系的 ModelBind?

    我在 MVC 3 应用程序中遇到了同样的问题 我有一个创建新产品的视图 并且该产品可以分配给一个或多个类别 这是我的 EF Code First 模型类 public class Product public int ProductID g