【问题标题】:Are the M and the V from MVC even needed in ASP.NET Web API?ASP.NET Web API 中是否需要 MVC 中的 M 和 V?
【发布时间】:2016-01-01 17:07:02
【问题描述】:

我有一个 Web API 应用程序,它使用一个控制器来返回从文件中读取的数据。

所以我使用的只是 MVC 的 C(控制器)部分。我没有视图,也没有使用模型 - 我正在将数据存储到 App_Data 文件夹或从 App_Data 文件夹中检索数据。

我知道这是一个相当简单的解决方案,但似乎我只需要 C,而不是 MVC。我错过了什么吗?

【问题讨论】:

  • 好的,但解决方案结构确实包含 Controller、Model 和 View 文件夹 - 我正在使用路由和 Controller 类来响应 URL。
  • 您的 API 是最近创建的?查看我在 CodeCaster 的回答中的评论,您可能会发现为什么会发生这种情况。
  • @jpgrassi:是的,它是在一两天前创建的,在 VS 2013 中。
  • 原来如此。您可能选择了 Web Api 模板,它包含所有 MVC 内容。如果它真的困扰您,请重新开始,但这次选择 The Empty 模板,然后标记 Web Api 选项。

标签: c# asp.net-mvc design-patterns asp.net-web-api


【解决方案1】:

Model-View-Controller is a design pattern,帮助构建具有 GUI 的应用程序。 ASP.NET MVC 是一个框架,可帮助您根据此设计模式构建 Web 应用程序。

Web API 与 MVC 设计模式无关。它是单独开发的,暂时以相同的名称分发,现在完全是一个自己的框架:http://www.asp.net/web-api

有些项目模板仍然在您的项目中创建“模型”和“视图”目录,这意味着您使用的是过时的项目模板,或者假设您在一个项目中需要 MVC 和 Web API。

【讨论】:

  • 这是真的。在 VS2013 中,当您启动一个新的 Web 应用程序模板时,如果您单击 Web API 项,它会自动勾选 MVC 的复选框,从而创建 OP 所说的所有结构。但是如果您开始一个新项目并选择“空”,他们会选中 API 复选框。它只会创建控制器和模型(大多数时候你需要)。
【解决方案2】:

CodeCaster 的回答已经很好地解释了您问题背后的“理论”。虽然,我会提供一个答案,因为我在几个月前偶然发现了这个问题,并且花了一些时间来弄清楚为什么最近创建的 Web API 项目还具有视图和 ASP.NET MVC 应用程序具有的所有其他项目。

在 Visual Studio 2013 中,有 Web 应用程序模板。当您选择此选项时,将打开一个窗口。在此窗口中,有一个用于创建 Web Api 的选项。问题在于这里。当您在窗口中选择 Web Api 时(当然这是您想要的),由于某种原因,它还会在 “添加文件夹和核心引用”中标记 MVC 的选项 更糟糕的是,复选框被禁用,所以你不能“取消选中”它(太奇怪了):这就是它的样子:

如果此时您点击“确定”,则会使用所有 MVC 引用创建 API。可能不是你想要的。

所以,要创建一个“纯”Web API,它只包含 Web API 相关文件和结构的引用,这就是你需要做的:

选择 Empty 模板,然后标记 Web API 选项。 :

【讨论】:

  • 谢谢;臭味并没有真正困扰我,但下次我会遵循这个方案。
【解决方案3】:

假设您的控制器具有将从前端应用程序调用的操作。作为该调用的结果发送的数据可以被认为是模型。然后前端应用程序可以使用该模型来显示视图。但你也可以不做任何事情。如果需要,您可以作为开发人员正确使用 MVC 模式。

【讨论】:

    【解决方案4】:

    随着项目规模/复杂性的增加,几乎所有软件模式都开始变得最有意义,并且所讨论的场景反映了模式背后的假设。在许多简单的场景中,模型和视图组件要么是隐式的,要么由框架本身提供,要么根本不需要。 MS ASP.NET MVC 本质上是提供一个框架来实现 MS Web 生态系统中的基本 MVC 模式。是否需要使用单个功能(如 EF 建模、Razor 视图)取决于您。

    根据您的问题,您的要求基本上是允许访问存储过程并执行基本数据转换(通过 POST),然后将该数据作为 JSON 返回(通过 GET)。单独的 GET/POST 请求的必要性是什么?根据您的问题,GET 依赖于前面的 POST 请求。我建议创建中间 JSON 文件可能是不必要的,而只是查找数据并将其返回。

    【讨论】:

    • 它们是两个独立的操作的原因是它们发生在不同的时间。 POST 是从用于生成电子表格文件并发送带有附件的电子邮件的实用程序调用的。存储过程需要几分钟才能运行,因此不可能立即返回结果。到用户收到电子邮件时,json 文件已创建并存储。然后,他们单击电子邮件中的链接,在浏览器的页面中以 html 格式取回数据。所以 POST 由同事使用的实用程序调用(他们不知道,以编程方式); ……
    • (续)...用户在单击文件链接时调用 GET。
    【解决方案5】:

    如果我们不将控制器操作返回的数据视为视图,您的数据的视图而不是 HTML 视图,设计模式没有指定视图的类型。在我看来,它仍然是 MVC,模型仍然存在,您通常会创建要返回的数据模型,视图部分只是核心模型类的另一个模型或视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 2010-10-22
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      相关资源
      最近更新 更多