asp.net mvc 文件夹/对象层次结构

Posted

技术标签:

【中文标题】asp.net mvc 文件夹/对象层次结构【英文标题】:asp.net mvc folder/object hierarchy 【发布时间】:2013-01-27 10:03:57 【问题描述】:

背景

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

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

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

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

问题

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

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

编辑:上面添加的要求是 ImportTemplate 可以与产品以外的对象(即客户)相关联,将 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 文件中名为“title”的列导入“产品名称”字段。 CSV 中“类别”列下无法识别的类别应导入为“未知”类别。

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

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

【问题讨论】:

您的模板是保存为视图还是仅仅是功能/保存的列映射? @Jack 他们目前计划保存列的映射。 【参考方案1】:

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

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

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

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

你可以这样使用:

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 文件夹中

【讨论】:

模板数量因用户选择导入的供应商而异。由于存在新供应商的可能性,并且由于他们为每个用户集成的方式也可能不同,因此 UI 将需要一些动态方法来添加、编辑和删除模板。添加和编辑模板“实例”不是一个或多个视图的好候选吗?我知道我可以让动态类在核心库中工作,但在这种情况下,每个模板的功能都是相同的。每个实例只会更改字段映射。

以上是关于asp.net mvc 文件夹/对象层次结构的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ASP.NET MVC 在 Kendo UI Grid 中实现 N 级嵌套层次结构

ASP.NET MVC 3 文件夹结构

ASP.NET开发实战——ASP.NET MVC & 分层 代码篇

在 ASP.NET MVC (C#) 上提供静态文件

另类的ASP.NET快速开发架构体系

asp.net mvc web窗体文件中如何获取HttpContextBase对象