所以,我正在将区域从使用AreaRegistration切换到使用属性路由.我遇到的问题似乎是由路由加载到路由表中的顺序引起的.我通过最后加载有问题的路由解决了AreaRegistration中的问题,因此只有当所有其他路由不匹配时才会匹配该路由.使用属性路由,这似乎不可能.我在创建路由时有Order参数,但这不会影响路由表的方式,除非非常狭窄.
这是我在AreaRegistration文件中的路由:
context.MapRoute(
name: "ActionItems_home",
url: "ActionItems/{group}/{statuses}/{overdueOnly}",
defaults: new { controller = "Home", action = "Index", group = "All", statuses = "New,Open", overdueOnly = false },
namespaces: new string[] { "IssueTracker.Areas.ActionItems.Controllers" }
);
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试将其切换到属性路由时,唯一接近工作的是:
[Route("", Order = 4)]
[Route("{group:regex(^(?!Item|DecisionLogs))?}", Order = 3)]
[Route("{group:regex(^(?!Item|DecisionLogs))}/{statuses=New,Open?}", Order = 2)]
[Route("{group:regex(^(?!Item|DecisionLogs))}/{statuses=New,Open}/{overdueOnly:bool=false?}", Order = 1)]
Run Code Online (Sandbox Code Playgroud)
请注意,我必须放入正则表达式,因为否则不会调用Item控制器 - 相反,我最终将字符串'Item'作为group参数传入.但正则表达式并不特别有助于URL的最终呈现方式.
我想为在URL,除非他们非默认被抑制的可选参数.我已经尝试将参数指定为可选参数,使用默认值,以及可选参数和默认值.他们似乎都没有真正做到这一点.
目前的解决方案,至少没有呈现一个查询字符串的URL,但它们包括可选参数,使事情难看.现在,我只是简单地将令人震惊的路线留在AreaRegistration文件中,而不是用[Route()]碎片装饰它们.
我开始了一个新的应用程序,现在我正在寻找两条路径,不知道哪种方法可以继续.
我正在构建类似电子商务网站的东西.我有一个类别和子类别.
问题是现场有不同类型的产品,每个产品都有不同的属性.并且网站必须可以通过这些产品属性进行过滤.
这是我最初的数据库设计:
Products{ProductId, Name, ProductCategoryId}
ProductCategories{ProductCategoryId, Name, ParentId}
CategoryProperties{CategoryPropertyId, ProductCategoryId, Name}
ProductPropertyValues{ProductId, CategoryPropertyId, Value}
Run Code Online (Sandbox Code Playgroud)
经过一些分析,我发现这个设计实际上是EAV模型,我读到人们通常不推荐这种设计.
似乎所有东西都需要动态的SQL查询.
这是一种方式,我现在正在看它.
我看到的另一种方式可能被称为很多工作方式,但如果它更好,我想去那里.制作桌子
Product{ProductId, CategoryId, Name, ManufacturerId}
Run Code Online (Sandbox Code Playgroud)
并在数据库中创建表继承,这意味着使表格像
Cpus{ProductId ....}
HardDisks{ProductId ....}
MotherBoards{ProductId ....}
erc. for each product (1 to 1 relation).
Run Code Online (Sandbox Code Playgroud)
我知道这将是一个非常大的数据库和非常大的应用程序域,但它比EAV设计的选项更好,更容易,性能更好.
sql database database-design relational-database entity-attribute-value