- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ASP.NET MVC4。我完全不知道从哪里开始——我需要显示一个分层网格,每个级别都有 CRUD 操作(编辑行、创建行、删除行)。我在 Entity Framework (.edmx) 中使用数据库优先的方法。实体之间的关系由我数据库中同一行中的“ParentId”值维护。我想让“删除”功能级联到所有子级,就像在 SQL Server 中的关系设置中一样。
问题:如果我想使用 ParentId 的想法来维护分层关系,并使用 CRUD 操作完成分层网格,我应该从哪里开始寻找?我查看了 ListViews,但我认为这不是我所需要的。除非绝对必要,否则我不想将其过度复杂化,并且我宁愿不采用公开的解决方案。
最佳答案
我最终使用了 MvcTreeView ( http://mvctreeview.codeplex.com/
)。这在 Nuget 中也可用。此 Html Helper 专门设计用于邻接列表(通过 ParentId 列或类似列维护其层次结构的层次表)。此帮助器生成表中每条记录的分层 TreeView 。此外,您可以通过在每个项目上添加单独的 CRUD 操作来进一步自定义,CRUD 将像在带有 Entity Framework 的普通 ASP.NET MVC 项目中一样正常工作。
要一直向下级联删除“n”深度的树,方法如下:
我最终创建了一个专门用于邻接列表的自定义模块。 SQL 中的邻接表是您有一个表通过列 ParentId 维护“n”深度层次结构的地方,该列是返回到同一表中的 Id 列(主键)的外键。
我创建了一个名为“Children”的辅助类。此类的目的是返回给定父级的所有遍历子 ID 的列表。因此,如果您为父级传递 Id,即向上 6 级,下面的代码将向下遍历所有 6 级并返回所有子级、孙级、曾孙级等的完整 ID 列表。
我得到所有子 ID 的列表而不是要删除的对象列表的原因是,如果我得到要删除的对象列表,我将不得不在不同的 DbContext 下获取这些对象,所以当我尝试实际删除它们,我会收到一条错误消息,指出该对象已分离(或类似的东西),因为它是在不同的上下文中实例化的。获取 ID 列表可以防止这种情况发生,我们可以使用相同的上下文来执行删除。
所以,调用这个方法GetChildrenIds(List<int> immediateChildrenIds)
从您的代码中传入 ints
的列表对应于选定节点的直接子节点。例如,要获取要传递给此方法的直接子项列表,请使用类似以下内容(这是基于使用 WebAPI 的 ASP.NET MVC 模式):
// keep in mind that `id` is the `id` of the clicked on node.
// DELETE api/region/5
public HttpResponseMessage Delete(int id)
{
Region region = db.Regions.Find(id);
List<int> tempRegionIds = new List<int>();
List<int> immediateChildrenIds = (from i in db.Regions where i.ParentId == id select i.Id).ToList();
List<int> regionsToDeleteIds = new List<int>();
// the below is needed because we need to add the Id of the clicked on node to make sure it gets deleted as well
regionsToDeleteIds.Add(region.Id);
// we can't make this a static method because that would require static member
// variables, and static member variables persist throughout each recursion
HelperClasses.HandleChildren.Children GetChildren = new HelperClasses.HandleChildren.Children();
// see below this code block for the GetChildrenIds(...) method
tempRegionIds = GetChildren.GetChildrenIds(immediateChildrenIds);
// here, we're just adding to regionsToDeleteIds the children of the traversed parent
foreach (int tempRegionId in tempRegionIds)
{
regionsToDeleteIds.Add(tempRegionId);
}
// reverse the order so it goes youngest to oldest (child to grandparent)
// is it necessary? I don't know honestly. I just wanted to make sure that
// the lowest level child got deleted first (the one that didn't have any children)
regionsToDeleteIds.Reverse(0, regionsToDeleteIds.Count);
if (regionsToDeleteIds == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
foreach (int regionId in regionsToDeleteIds)
{
// here we're finding the object based on the passed in Id and deleting it
Region deleteRegion = db.Regions.Find(regionId);
db.Regions.Remove(deleteRegion);
}
...
下面的代码是返回子 ID 的完整列表的类。我将这段代码放在一个单独的帮助程序类文件中。 DbContext _db
当我说您不想在此上下文中检索对象列表时,我在说什么,否则 Delete
在您的 Controller 中实际调用它时将不起作用。因此,正如您所见,我改为获取 ID 列表并进行实际的 DbContext 调用以获取我的 Controller 内的对象,而不是这个帮助程序类。
public class Children
{
private Entities _db = new Entities(HelperClasses.DBHelper.GetConnectionString());
private List<int> _childrenIds = new List<int>();
private List<int> _childRegionIds = new List<int>();
public List<int> GetChildrenIds(List<int> immediateChildrenIds)
{
// traverse the immediate children
foreach (var i in immediateChildrenIds)
{
_childRegionIds.Add(i);
_childrenIds = (from child in _db.Regions where child.ParentId == i select child.Id).ToList();
if (_childrenIds.Any())
GetChildrenIds(_childrenIds);
else
continue;
}
return _childRegionIds;
}
}
关于c# - 对邻接列表(具有 ParentId 列的表)进行 CRUD 操作的分层网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18921397/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我刚刚发现了这门语言,我想知道是否可以使用数据库制作基本的 CRUD 网络应用程序。 最佳答案 有 mysql 的库和 postgresql , 核心库提供了一个 web server支持 HTTP、
Symfony 4.0 发布后,不再支持 SensioGeneratorBundle .因此命令 php app/console generate:doctrine:crud不可用。 他们建议使用 M
在开发 Web 应用程序时,我通常会看到人们执行增删改查和同步 View 的两种方式。 这里是使用 ajax 的高级示例。 1-方法一 创建操作可能涉及 POST 请求,成功后只需执行另一个 GET
我已经成功地使用 Yii2 模型和 CRUD 生成器为我的网络应用程序获取了一些框架代码文件。特别是,CRUD Generator 声称已成功将其 View 文件创建到: /basic/views//
在我的项目中,我一直在使用 Django 的通用 CRUD View 来处理很多事情。我现在想开始迁移到 DJango 1.3 中基于类的新样式通用 CRUD View 。我没有发现这些文档有多大帮助
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 7年前关闭。 Improve this
我希望标题不要太含糊,所以这里是: 我创建了一个 MySQL 数据库,其中存储了两个表:一个包含输入数据,另一个包含输出数据。 之后我编写了一个程序,连接到这个特定的数据库,从输入表中提取数据,解析它
我需要编辑我的实体以获得更多值。我已经用我之前的值生成了 crud。如何在编辑实体后通过应用程序/控制台重新生成 crud,以便它自动为其他值生成函数。 最佳答案 为此,您需要删除为此 crud 生成
因此,我仅使用 JavaScript 创建了一个简单的 CRUD 应用程序。现在,您可以将国家/地区添加到数组中并从数组中删除国家/地区。我希望能够编辑数组中的现有国家/地区,例如我想将“斯德哥尔摩”
我想让java中的一个类有一个可以与Hibernate配置交互并执行某些操作的方法,该方法被标识为ENUM(例如:读取,更新,添加,删除等) 方法参数应为(枚举操作、类 DTO、NamedQuery
我正在构建一个 React 应用程序,并使用 auth0 来登录/验证用户。 在使用 auth0 之前,我一直在对 API 进行 CRUD 调用来发布帖子。这又是在使用 auth0 之前、在我拥有用户
尝试使用 BlueJ 构建我的第一个 Java MySQL CRUD 应用程序。我可以运行该应用程序并将数据写入 MySQL 数据库。但是,当我运行搜索函数时,我得到了 Java .NullPoint
我正在试用 Microsoft Master Data Services,我想以编程方式将数据添加到数据库中。我开始获得模型/实体/成员结构,但我还不确定。如果您对此结构有很好的解释,请分享。 假设有
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
我已经根据文档和 medium article 模拟了与 Room 的多对多关系。 .使用这个@Relation,我可以从数据库中检索RecipeWithIngredients 或Ingredient
Closed. This question is opinion-based。它当前不接受答案。 想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 3年前关闭。
通过AngularJS通过REST进行CRUD操作的最佳实践是什么? 特别是这里的 Angular-Way 。我的意思是使用最少代码和最默认 Angular 设置来达到此目的的方式。 我知道$ res
我无法弄清楚我的更新功能。我能够从数据库中检索和删除,但我不知道如何更新。这对我来说是全新的,所以我很困惑。 .js 文件 //update user $("#btnUpdateUser").clic
我正在寻找一种对用户透明的 CRUD 操作后重新加载页面的方法。 实际上,在创建或删除之后,我必须重新加载页面才能显示我的操作。 我使用 api 来实现这个,当我将它与 json 文件一起使用时,它工
我是一名优秀的程序员,十分优秀!