背景
我有一个Asp.net MVC 3.5应用程序,它使用CSV文件导入产品。CSV文件可以来自一组特定的可配置源。要配置新的CSV源,用户最初会指定哪些CSV列映射到哪些产品属性。此配置将存储为导入模板,并在执行每次导入时可供选择。
我在尝试为该功能规划文件夹/对象结构时遇到了麻烦。我理解(也喜欢)Asp.netMVC在路由方面的灵活性,所以我知道我们可以在这里做任何事情。然而,我想要任何能帮助我们保持对象结构更加健全和可维护的建议。
最初,我设置了一个包含Import.aspx视图的"产品"文件夹。这似乎很适合控制器/动作模型。然而,当我考虑到上面提到的管理模板的功能时,事情会变得令人困惑。
EDIT:导入模板可以应用于不同的对象。因此,Product只是一个可以为其创建一个或多个ImportTemplates的对象。例如,另一个可能有ImportTemplate的对象可能是Customer。
问题
我应该在Product文件夹下创建一个名为ImportTemplate的子文件夹,并将CRUD视图放在那里吗?然后,我将为导入模板函数添加一个自定义路由。我关心的是文件夹的深度以及与同级操作Import的混淆。还是应该将ImportTemplate提升一个级别,然后使用路由将其放置在Product文件夹下?听起来很乱。
也许文件夹结构应该是Product/Import/Template。在这种情况下,我看到的问题是Import并不是一个真正的对象。我可以看到它是一个控制器,但它实际上是动作。如果我使用此结构,我是否应该在Import文件夹中放置Upload.aspx视图(以替换上面提到的Product/Import.aspx)?这似乎有点笨拙。
编辑:上面增加了ImportTemplate可以与产品(即客户)以外的对象关联的要求,将ImportTemplate文件夹直接放在Views文件夹下会更好吗?
对于构建这个对象/文件夹层次结构,有其他想法吗?
研究
为了研究这个问题,我回顾了有关文件夹结构和深度的问题。以下是几个有答案的问题,但实际上并没有回答我的问题。
-ASP.NET MVC一个视图或URL应该有多深级别?
-ASP.NET MVC 3文件夹结构
-分层MVC路由策略
一个例子
编辑:用户定期从第三方导入产品列表。他们正在从CSV文件导入数据,该文件将上载到网站。他们创建产品导入模板的实例/将其添加到自己的帐户中。此模板实例存储以下设置:
- 名为";标题";CSV文件中的"产品名称"字段
- 在";类别";CSV中的列应该被导入为"列";未知";类别
不同的用户可能基于不同的第三方CSV格式或基于他们自己的系统配置而具有不同的规则(即,他们不像上述用户那样具有未知类别设置)。
- 名为";部件号";CSV中的应导入到"产品名称"字段和"产品编号"字段
- 默认情况下,无法识别的类别应导入到";Generic;类别
您绝对正确,考虑到ASPMVC的灵活性,您可以在这里做任何关于文件夹结构的事情。如果你习惯了ASP.NET WebForms,请记住MVC完全不同,它不使用文件夹和文件作为资源的直接映射,路由基于控制器和操作。这可能需要你习惯于用"ASP经典"的方式。
因此,关键的考虑因素是什么对你和你的用户最有意义,每个人都清楚一切在哪里
也许文件夹结构应该是Product/Import/Template。这个在这种情况下,我看到的问题是Import并不是一个真正的对象。我可以看到它是一个控制器,但它实际上是行动如果使用此结构,是否应在Import文件夹(替换前面提到的Product/Import.aspx以上)?这似乎有点笨拙。
是的,听起来你的控制器应该有一个导入操作或上传操作,等等。每个控制器的视图文件夹中都可以有一个相应的视图,,但模板本身可能不需要是视图。您的模板只是导入产品时控制器操作将引用的资源。在这种情况下,自定义路由不会成为问题,我也不会将模板放在视图文件夹中。我会把它们放在一个中心位置,并在所有需要访问它们进行导入操作的控制器中引用它们。
你可以使用这样的东西:
MyApp project
Controllers
ProductController
Models
Product
ImportTemplate
Template1
Template2
Views
Product
Import.aspx
Edit.aspx
Index.aspx
etc…
Import.aspx
或Upload.aspx
可能是用户可以选择模板并导入产品(或映射列并保存新模板)的页面。每个视图都将具有相应的控制器操作。您的控制器的导入或上载操作将直接访问模板文件;你所需要做的就是在你的控制器中包括一个ImportTemplate文件夹的引用(或者模型,服务层…任何将使用该模板的地方)
using MyApp.ImportTemplate
//namespace matches folder structure, “MyApp/ImportTemplate”
当用户在产品导入页面上时,URL将类似于/Product/Import/
,模板本身不一定会出现在URL中,除非您将其作为参数/Product/Import/templateID
或/Product/Import?templateID=123456
传递。
同样,关键是要做对你的项目最有意义的事情,让事情井然有序,清晰明了,并在构建/部署应用程序时为你节省时间。
例如,我倾向于将事情分成两个或多个项目,以便在部署时更容易。举个例子,我可能有一个这样的文件夹结构:
App.UI project
Content
CSS
Scripts
Images
Views
App.Core project (any code that will be compiled)
Controllers
Templates
Models
Helpers
Interfaces
Repositories
ViewModels
然后我只需要部署App.UI
项目,App.Core
中的所有内容都将被编译并包含在App.UIbin
文件夹