如何使用 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? 的相关文章

随机推荐

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

    如何删除名称以给定字符串开头的所有表 我认为这可以通过一些动态 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