6

背景

我有一个使用 CSV 文件导入产品的 Asp.net MVC 3.5 应用程序。CSV 文件可以来自一组特定的可配置源。要配置新的 CSV 源,用户最初会指定哪些 CSV 列映射到哪些产品属性。此配置将存储为导入模板,并在之后每次导入时可供选择。

我在尝试为此功能规划文件夹/对象结构时遇到了困难。我理解(并且喜欢)Asp.net MVC 在路由方面的灵活性,所以我知道我们可以在这里做任何事情。但是,我想要任何可以帮助我们保持对象结构更加健全和可维护的建议。

最初,我设置了一个包含 Import.aspx 视图的产品文件夹。这似乎很适合控制器/动作模型。但是,当我考虑管理上述模板的功能时,事情变得令人困惑。

编辑:导入模板可以应用于不同的对象。所以 Product 只是一个可以为其创建一个或多个 ImportTemplate 的对象。例如,可能具有 ImportTemplate 的另一个对象可能是 Customer。

问题

我应该在 Product 文件夹下创建一个名为 ImportTemplate 的子文件夹并将 CRUD 视图放在那里吗?然后我会为导入模板函数添加一个自定义路由。我在这里关心的是文件夹深度以及与兄弟操作导入的混淆。还是应该将 ImportTemplate 提升一个级别,然后使用路由将其放置在 Product 文件夹下?听起来很乱。

也许文件夹结构应该是产品/导入/模板。我在这种情况下看到的问题是 Import 并不是一个真正的对象。我可以看到它是一个控制器,但它实际上是一个动作。如果我使用这种结构,我是否应该在 Import 文件夹中放置一个 Upload.aspx 视图(以替换上面提到的 Product/Import.aspx)?这似乎有点笨拙。

编辑:上面添加的要求是 ImportTemplate 可以与除产品(即客户)以外的对象相关联,将 ImportTemplate 文件夹直接放在 Views 文件夹下会更好吗?

构建此对象/文件夹层次结构的任何替代想法?

研究

为了研究这个问题,我回顾了有关文件夹结构和深度的问题。这里有几个问题有答案,但实际上并没有为我的问题提供答案。

- ASP.NET MVC 视图或 URL 应该有多少层?

- ASP.NET MVC 3 文件夹结构

-分层 MVC 路由策略

一个例子

编辑:用户定期从第三方导入产品列表。他们正在从将上传到网站的 CSV 文件中导入数据。他们创建/添加产品导入模板的实例到他们的帐户。此模板实例存储以下设置:

  • CSV 文件中名为“title”的列应导入到 Product Name 字段。
  • CSV 中“类别”列下无法识别的类别应导入为“未知”类别。

不同的用户可能有不同的规则,基于不同的第 3 方 CSV 格式或基于他们自己的系统配置(即,他们没有上述用户的未知类别设置)。

  • CSV 中名为“部件号”的列应导入到“产品名称”字段和“产品编号”字段。
  • 默认情况下,无法识别的类别应导入“通用”类别。
4

1 回答 1

0

您是绝对正确的,鉴于 ASP MVC 的灵活性,您可以在此处就文件夹结构做任何事情。如果您习惯于 ASP.NET WebForms,请记住 MVC 完全不同,因为它不使用文件夹和文件作为资源的直接映射,并且路由基于控制器和操作。当您习惯以“ASP 经典”方式进行操作时,这可能需要您习惯。

因此,关键的考虑因素是什么对您和您的用户最有意义,并且每个人都清楚一切在哪里。

也许文件夹结构应该是产品/导入/模板。我在这种情况下看到的问题是 Import 并不是一个真正的对象。我可以看到它是一个控制器,但它实际上是一个动作。如果我使用这种结构,我是否应该在 Import 文件夹中放置一个 Upload.aspx 视图(以替换上面提到的 Product/Import.aspx)?这似乎有点笨拙。

是的,听起来你的控制器应该有一个 Import 动作,或 Upload 动作等……这些中的每一个都可以在该控制器的视图文件夹中有一个相应的视图,但模板本身可能不需要是 views。您的模板只是导入产品时控制器操作将引用的资源。在这种情况下,自定义路由不会成为问题,我不会将模板放在视图文件夹中。我会将它们放在一个中心位置,并在我所有需要访问它们以进行导入操作的控制器中引用它们。

你可以使用这样的东西:

MyApp project
    Controllers
        ProductController
    Models
        Product
    ImportTemplate
        Template1
        Template2
    Views
        Product
            Import.aspx
            Edit.aspx
            Index.aspx
            etc…    

Import.aspxUpload.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.UI\bin文件夹中

于 2013-02-21T18:18:53.647 回答