我有一个使用CSV文件导入产品的Asp.net MVC 3.5应用程序。 CSV文件可以来自特定的可配置源组。要配置新的CSV源,用户最初会指定哪些CSV列映射到哪些产品属性。此配置将存储为导入模板,并在执行每次导入后可供选择。
我试图计划此功能的文件夹/对象结构时遇到了问题。我理解(并且喜欢)Asp.net MVC的灵活性,所以我知道我们可以做任何事情。但是,我想任何有助于我们保持对象结构更健全和可维护的建议。
最初我设置了一个包含Import.aspx视图的Product文件夹。这似乎足够适合控制器/动作模型。但是,当我考虑上面提到的管理模板的功能时,事情会变得混乱。
编辑:导入模板可以应用于不同的对象。因此,Product只是一个可以为其创建一个或多个ImportTemplates的对象。例如,可能具有ImportTemplate的另一个对象可以是Customer。
我应该在Product文件夹下创建一个名为ImportTemplate的子文件夹并将CRUD视图放在那里吗?然后,我将为导入模板功能添加自定义路由。我关心的是文件夹深度以及与兄弟动作导入的混淆。或者ImportTemplate应该升级,然后使用路由将其放在Product文件夹下?听起来很乱。
也许文件夹结构应该是Product / Import / Template。我在这种情况下看到的问题是Import实际上不是一个对象。我可以看到它是一个控制器,但它确实是动作。如果我使用这个结构,我应该在Import文件夹中放置一个Upload.aspx视图(以替换上面提到的Product / Import.aspx)?这似乎有点笨拙。
编辑:由于上面添加的要求可以将ImportTemplate与Product(即Customer)以外的对象相关联,最好将ImportTemplate文件夹直接放在Views文件夹下吗?
构建此对象/文件夹层次结构的其他任何想法?
为了研究这个问题,我回顾了有关文件夹结构和深度的问题。以下是几个有答案的问题,但实际上没有回答我的问题。
- ASP.NET MVC How many levels deep should a view or URL be?
- ASP.NET MVC 3 folder structures
- Strategy for Hierarchical MVC Routing
编辑:用户定期从第三方导入产品列表。他们正在从CSV文件导入数据,该文件将上传到网站。他们在其帐户中创建/添加产品导入模板的实例。此模板实例存储以下设置:
其他用户可能根据不同的第三方CSV格式或基于他们自己的系统配置而有不同的规则(即他们没有像上面的用户那样设置未知类别)。
答案 0 :(得分:0)
你是绝对正确的,鉴于ASP MVC的灵活性,你可以在这里做任何关于文件夹结构的事情。如果您习惯使用ASP.NET WebForms,请记住MVC完全不同,因为它不使用文件夹和文件作为资源的直接映射,并且路由基于控制器和操作。当你习惯用“ASP经典”的方式时,这可能会习惯。
因此,关键考虑因素是对您和您的用户最有意义的,并且每个人都清楚一切都在哪里。
也许文件夹结构应该是Product / Import / Template。该 在这种情况下我看到的问题是Import实际上不是一个对象。 我可以看到它是一个控制器,但它真的意味着它 行动。如果我使用这个结构,我应该放入一个Upload.aspx视图 导入文件夹(替换提到的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”
当用户在产品导入页面上时,该网址将类似于/Product/Import/
,并且模板本身不一定会显示在网址中,除非您将其作为参数/Product/Import/templateID
或{{1}传递}。
同样,关键是要做对您的项目最有意义的事情,并为您保持井井有条和清晰,并且在您构建/部署应用程序时可以节省您的时间。
例如,我倾向于将事情分成两个或更多项目,以便在部署时更容易。举个例子,我可能有这样的文件夹结构:
/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
文件夹中