【问题标题】:Create Entity from another Entity in MVC从 MVC 中的另一个实体创建实体
【发布时间】:2015-05-21 02:32:14
【问题描述】:

不确定标题是否足够清晰。我在 MVC-EF 应用程序中有产品和类别实体。添加新产品时,我从下拉列表中选择类别。如果产品/创建页面的下拉列表中不存在新类别,我希望能够创建它。下拉列表旁边可能有一个类似“添加新类别”的按钮。

例如:如果我想添加一本属于烹饪部门的书(不在列表中),我希望能够在添加烹饪部门的同时添加该书而不去到部门/创建视图

【问题讨论】:

  • 你有没有尝试过?如果是这样,请发布您尝试的代码。
  • 没有。你的问题不清楚。你知道做什么,不知道做什么?

标签: c# asp.net-mvc entity-framework


【解决方案1】:

嗯,有三种主要方法:

  1. 通过拉入 iframe 的模式窗口或类似窗口来处理类别创建。这是最简单的方法,因为类别创建与自己的操作和视图完全隔离。但是,您仍然需要一些 JavaScript 来更新您的选择列表选项,以在保存后包含新创建的项目。不过,这相对容易。您只需向某个返回所有可用类别的端点发出 AJAX 请求,并在模式关闭后使用它来重建选择列表。

  2. 使用 AJAX 创建类别。这比 #1 稍微复杂一些,但仍然相对简单。您只需有一个表单,其中包含嵌入页面某处的新类别的字段。您还可以使用 AJAX 从返回 PartialViewResult 的操作中请求表单 HTML。无论哪种方式,您都可以通过模态或任何您喜欢的方式向用户展示它。然后,当他们提交时,而不是传统的表单发布,您只需向负责实际保存它的某个端点发出带有序列化表单数据的 AJAX 请求。与 #1 一样,您需要额外的 JavaScript 在保存类别后相应地更新您的选择列表。

  3. 将新类别包含在产品表单其余部分的发布数据中。这是三个选择中最复杂的一个,因为您必须在几个方面特别小心。您需要在视图模型上使用单独的集合来保存发布的类别或类别,并且您需要在保存之前手动将这些新类别添加到您的产品实体中。您还需要将其与通过选择列表关联的类别同步。

为您提供更具体的内容超出了 StackOverflow 的范围。无论您选择上述三种方法中的哪一种,稍作研究都会找到足够多的文章/教程来帮助您滚动。如果您在构建解决方案的过程中遇到具体问题,可以回到这里就这些问题提出具体问题。

【讨论】:

  • 谢谢,有第一种方法的例子吗?
【解决方案2】:

我对一个项目有类似的要求。做这样的事情:

public class Category 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后,您可以使用所有类别填充下拉列表,然后您就可以制作更多类别。

在您的产品上,您只需创建类别的虚拟属性即可访问它。

public class Product
{
    public int Id { get; set; }
    //Rest of your fields
    public int CategoryId { get; set; }

    public virtual Category Category { get; set; }
}

这样做可以让您根据需要延迟加载相关实体。

【讨论】:

  • 如果类别下拉列表也是由外键链接的单独表,这不会中断吗?
  • 一点也不。通过使用虚拟和类别 ID,它可以很好地链接它们,并且是 EF 的主要功能之一。我一直在做这样的事情,因为这是一个很常见的要求。编辑:还值得注意的是,只要您使用 DropDown 作为具有 Ids 的值,当它被回发时,您只需将其传递到 CategoryId 属性,EF 就会适当地链接它。当然,您可能想检查该 ID 是否存在;)
  • @Giltch100,这已经对我有用了。所有类别都在下拉列表中。我想在创建新产品时创建一个新类别而不离开产品/创建视图
  • 然后,Mike 只需让添加新类别启用另一个文本框,然后查看模型在发布时是否具有该文本框并使用它。或者在控制器上创建另一个 ActionResult 或进行 api 调用,然后将“添加新类别”ajax 发布到该控制器上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2021-04-12
  • 2013-02-19
相关资源
最近更新 更多