ASP.NET Core 是一个跨平台的、高性能的、开源的框架,用于构建现代化、基于云的网络应用程序。在这个框架中,MVC (Model-View-Controller) 和 Web API 是两种常用的架构模式,尽管它们在某种程度上可以相互重叠,但它们各自有不同的设计目标和用途。
MVC (Model-View-Controller)
设计目标:MVC 主要用于构建用户界面驱动的 Web 应用程序,如网站和 Web 应用。MVC 模式通过将应用程序的逻辑、数据和用户界面表示层分离开来,帮助开发人员管理应用程序的复杂性。
组成部分:
Model:表示应用程序的数据和业务逻辑。它通常包含数据访问逻辑,如数据库交互。View:负责显示用户界面。在 ASP.NET Core MVC 中,视图通常使用 Razor 语法编写,它允许在 HTML 中嵌入 C# 代码以生成动态内容。Controller:处理用户的输入,通常与用户的交互(如点击按钮或提交表单)相对应。控制器接收请求,执行相应的业务逻辑(通常与模型交互),然后选择要呈现的视图。用法:当您想要构建一个具有丰富用户界面的 Web 应用程序时,MVC 是一个很好的选择。例如,一个电子商务网站、内容管理系统(CMS)或企业内网应用程序可能会使用 MVC。
Web API
设计目标:Web API 主要用于构建 RESTful 或其他基于 HTTP 的服务,这些服务为客户端(如 Web 应用程序、移动应用程序、桌面应用程序等)提供数据和功能。Web API 通常不直接涉及用户界面的呈现。
组成部分:
Controllers:与 MVC 中的控制器类似,但 Web API 控制器专注于处理 HTTP 请求和响应,而不是选择视图进行呈现。Routes:定义了如何映射 URL 到特定的控制器操作方法。Models:表示数据的结构和业务逻辑,与 MVC 中的模型类似。Actions:是控制器中的方法,用于处理 HTTP 请求并返回 HTTP 响应。这些响应通常包含数据(如 JSON 或 XML),而不是 HTML 视图。用法:当您想要为多个客户端(包括非 Web 客户端)提供数据和功能时,Web API 是一个很好的选择。例如,一个移动应用程序可能需要从后端服务检索数据;一个桌面应用程序可能需要调用后端服务以执行某些任务。在这种情况下,您可能会构建一个 Web API 来提供这些服务。
MVC 与 Web API 的关系
重叠:在某些情况下,MVC 应用程序可能会包含 Web API 功能,以便为其他客户端(如移动应用程序)提供数据。同样,Web API 也可以返回 HTML 视图,但这通常不是其主要用途。独立性:虽然 MVC 和 Web API 可以共存于同一个 ASP.NET Core 项目中,但它们也可以作为独立的项目或服务进行开发和部署。选择:选择 MVC 还是 Web API 取决于您的具体需求。如果您正在构建一个需要丰富用户界面的 Web 应用程序,那么 MVC 可能是一个更好的选择。如果您正在构建一个需要为多个客户端提供数据和功能的后端服务,那么 Web API 可能更合适。【实例】
以下是ASP.NET Core中MVC和Web API的简单代码实例。
MVC 代码实例
首先,我们来看一个简单的MVC控制器,它处理用户请求并返回一个视图:
// HomeController.cs[ApiController][Route("[controller]")]public class HomeController : Controller{ public IActionResult Index() { // 这里不处理任何业务逻辑,只是返回一个视图 return View(); } // 假设我们有一个简单的联系页面 public IActionResult Contact() { ViewData["Message"] = "Your contact page."; return View(); } // 处理表单提交等(这里仅作为示例) [HttpPost] public IActionResult Contact(ContactModel model) { if (!ModelState.IsValid) { // 如果模型验证失败,重新显示表单 return View(model); } // 假设这里处理表单提交的业务逻辑 // ... // 处理完成后重定向到某个页面 return RedirectToAction("Index"); }}
在上面的代码中,Index
和 Contact
方法分别返回了对应的视图。视图文件(如 Index.cshtml
和 Contact.cshtml
)将位于项目的 Views/Home
文件夹中。
Web API 代码实例
接下来,我们看一个简单的Web API控制器,它处理HTTP请求并返回JSON数据:
// ProductsController.cs[ApiController][Route("[controller]")]public class ProductsController : ControllerBase{ // 假设这里有一个产品列表 private List<Product> _products = new List<Product> { new Product { Id = 1, Name = "Product 1", Price = 100 }, new Product { Id = 2, Name = "Product 2", Price = 200 } }; // 获取所有产品 [HttpGet] public IActionResult Get() { return Ok(_products); // 返回产品列表的JSON表示 } // 获取单个产品 [HttpGet("{id}")] public IActionResult Get(int id) { var product = _products.FirstOrDefault(p => p.Id == id); if (product == null) { return NotFound(); // 如果产品不存在,返回404 Not Found } return Ok(product); // 返回单个产品的JSON表示 } // ... 其他CRUD操作(Create, Update, Delete)...}
在上面的代码中,ProductsController
是一个API控制器,它继承自 ControllerBase
而不是 Controller
。它定义了两个GET方法:一个返回所有产品的列表,另一个根据ID返回单个产品。这些方法使用HTTP GET请求,并返回 IActionResult
类型的响应,这允许它们根据需要返回不同的HTTP状态码和响应体。
请注意,Web API控制器通常使用 [ApiController]
特性,这提供了一些便利的功能,如自动的模型验证和更严格的路由行为。同时,Web API通常返回数据而不是视图,因此它们通常继承自 ControllerBase
而不是 Controller
。