位置: 文档库 > C#(.NET) > asp.net MVC 介绍

asp.net MVC 介绍

剧作家 上传于 2020-05-19 13:12

### ASP.NET MVC 介绍:从基础到进阶的完整指南

ASP.NET MVC 是微软基于 .NET 框架开发的 Web 应用程序框架,它采用模型-视图-控制器(Model-View-Controller,MVC)设计模式,将业务逻辑、用户界面和输入控制分离,为开发者提供了一种结构清晰、可测试性强的开发方式。自 2009 年发布首个版本以来,ASP.NET MVC 经历了多次迭代,逐渐成为企业级 Web 开发的主流选择之一。本文将从基础概念、核心组件、开发流程到高级特性,全面介绍 ASP.NET MVC 的核心内容。

一、MVC 设计模式概述

MVC 是一种软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种分离的目的是降低代码耦合度,提高可维护性和可扩展性。

  • 模型(Model):负责处理应用程序的数据逻辑,包括数据验证、业务规则和数据库交互。例如,一个用户管理系统中的“User”类就是模型,它可能包含用户名、密码等属性,以及保存用户到数据库的方法。
  • 视图(View):负责呈现用户界面,通常使用 HTML、CSS 和 JavaScript 构建。视图从模型获取数据,并将其显示给用户。例如,一个用户列表页面就是一个视图,它通过循环显示模型中的用户数据。
  • 控制器(Controller):作为模型和视图之间的桥梁,负责处理用户输入、调用模型方法,并决定返回哪个视图。例如,当用户访问“/Users/Index”时,控制器会调用模型获取所有用户,并将数据传递给视图进行渲染。

MVC 的优势在于:

  • 代码复用:模型和控制器可以在多个视图中使用。
  • 易于测试:可以单独测试模型和控制器,无需依赖视图。
  • 并行开发:不同团队可以同时开发模型、视图和控制器。

二、ASP.NET MVC 的核心组件

ASP.NET MVC 在标准 MVC 模式的基础上,提供了丰富的功能和工具,以下是其核心组件:

1. 路由系统(Routing)

路由系统负责将 URL 映射到控制器和动作方法。默认情况下,ASP.NET MVC 使用“控制器/动作/ID”的 URL 模式。例如,访问“/Products/Details/5”会调用 Products 控制器的 Details 方法,并传递参数 5。

路由配置通常在 RouteConfig.cs 文件中完成:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

2. 控制器(Controllers)

控制器是处理 HTTP 请求的核心组件,通常继承自 Controller 基类。每个公共方法称为一个“动作方法”(Action Method),可以返回视图、重定向或其他结果。

示例控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(); // 返回默认视图(Index.cshtml)
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";
        return View();
    }
}

3. 视图(Views)

视图使用 Razor 视图引擎(以 .cshtml 为扩展名),允许在 HTML 中嵌入 C# 代码。视图通过模型绑定接收数据,并使用 HTML 辅助方法(如 Html.ActionLinkHtml.TextBoxFor)简化开发。

示例视图(Views/Home/Index.cshtml):

@{
    ViewBag.Title = "Home Page";
}

@ViewBag.Message

Welcome to ASP.NET MVC!

4. 模型(Models)

模型可以是简单的 POCO(Plain Old CLR Object)类,也可以包含数据验证属性。ASP.NET MVC 支持数据注解(Data Annotations),用于在模型级别定义验证规则。

示例模型:

public class User
{
    [Required(ErrorMessage = "用户名不能为空")]
    [Display(Name = "用户名")]
    public string Username { get; set; }

    [Required(ErrorMessage = "密码不能为空")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

5. 辅助方法(HTML Helpers)

HTML 辅助方法用于简化视图中的 HTML 生成,例如创建表单、输入框和链接。常用辅助方法包括:

  • @Html.TextBoxFor(m => m.Username):生成文本输入框。
  • @Html.ValidationMessageFor(m => m.Username):显示验证错误信息。
  • @Html.ActionLink("首页", "Index", "Home"):生成链接。

三、ASP.NET MVC 开发流程

以下是一个完整的 ASP.NET MVC 开发流程示例:

1. 创建项目

在 Visual Studio 中选择“ASP.NET Web 应用程序”,然后选择“MVC”模板。

2. 定义模型

Models 文件夹中创建模型类,例如:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

3. 创建控制器

Controllers 文件夹中添加控制器,例如:

public class ProductsController : Controller
{
    private List _products = new List
    {
        new Product { Id = 1, Name = "Laptop", Price = 999.99m },
        new Product { Id = 2, Name = "Phone", Price = 699.99m }
    };

    public ActionResult Index()
    {
        return View(_products);
    }

    public ActionResult Details(int id)
    {
        var product = _products.FirstOrDefault(p => p.Id == id);
        if (product == null)
        {
            return HttpNotFound();
        }
        return View(product);
    }
}

4. 创建视图

右键点击控制器的动作方法,选择“添加视图”,生成对应的视图文件。例如,Views/Products/Index.cshtml

@model IEnumerable

产品列表

@foreach (var item in Model) { }
ID 名称 价格
@item.Id @Html.ActionLink(item.Name, "Details", new { id = item.Id }) @item.Price

5. 配置路由

确保 RouteConfig.cs 中的默认路由配置正确,以便访问 /Products/Index/Products/Details/1

四、ASP.NET MVC 的高级特性

1. 数据验证

ASP.NET MVC 支持模型级别的数据验证,通过数据注解或自定义验证属性实现。例如:

public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

在视图中,可以使用 @Html.ValidationSummary() 显示所有验证错误。

2. 依赖注入(DI)

ASP.NET MVC 支持依赖注入,可以通过构造函数注入服务。在 Startup.cs 中配置服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddScoped();
}

然后在控制器中注入:

public class ProductsController : Controller
{
    private readonly IProductRepository _repository;

    public ProductsController(IProductRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        var products = _repository.GetAll();
        return View(products);
    }
}

3. 异步编程

ASP.NET MVC 支持异步动作方法,通过 asyncawait 关键字实现。例如:

public class ProductsController : Controller
{
    private readonly IProductRepository _repository;

    public ProductsController(IProductRepository repository)
    {
        _repository = repository;
    }

    public async Task Index()
    {
        var products = await _repository.GetAllAsync();
        return View(products);
    }
}

4. 过滤器(Filters)

过滤器用于在动作方法执行前后添加逻辑,例如授权、异常处理等。常用过滤器包括:

  • [Authorize]:限制只有授权用户可以访问。
  • [HandleError]:捕获未处理的异常。
  • [OutputCache]:缓存动作结果。

自定义过滤器示例:

public class LogAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // 记录动作方法执行前的日志
        base.OnActionExecuting(filterContext);
    }
}

5. 区域(Areas)

区域用于将大型应用程序划分为多个模块,每个区域有自己的控制器、视图和模型。例如,一个电商网站可以分为“产品”区域和“订单”区域。

创建区域的步骤:

  1. 右键项目,选择“添加”->“区域”。
  2. 输入区域名称(如“Products”)。
  3. 在区域文件夹中创建控制器和视图。

区域路由配置:

public class ProductsAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Products"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Products_default",
            "Products/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

五、ASP.NET MVC 的最佳实践

以下是使用 ASP.NET MVC 时的最佳实践:

  • 保持控制器简洁:控制器应仅负责处理请求和返回响应,业务逻辑应放在模型或服务层中。
  • 使用视图模型(ViewModel):避免直接将模型传递给视图,而是创建专门的视图模型,包含视图所需的数据。
  • 利用 Razor 语法:Razor 语法简洁高效,优先使用 @model 和强类型辅助方法。
  • 实现输入验证:始终在模型级别验证用户输入,防止 SQL 注入和跨站脚本攻击(XSS)。
  • 优化性能:使用缓存、异步编程和最小化视图渲染时间。

六、总结

ASP.NET MVC 是一个功能强大、结构清晰的 Web 开发框架,通过模型-视图-控制器的分离,提高了代码的可维护性和可测试性。本文介绍了 MVC 设计模式、ASP.NET MVC 的核心组件(路由、控制器、视图、模型)、开发流程、高级特性(数据验证、依赖注入、异步编程、过滤器、区域)以及最佳实践。无论是初学者还是有一定经验的开发者,掌握 ASP.NET MVC 都能显著提升 Web 开发效率。

关键词:ASP.NET MVC、MVC设计模式、控制器、视图、模型、路由系统、数据验证、依赖注入、异步编程、Razor视图引擎

简介:本文全面介绍了ASP.NET MVC框架,涵盖MVC设计模式、核心组件(路由、控制器、视图、模型)、开发流程、高级特性(数据验证、依赖注入、异步编程、过滤器、区域)及最佳实践,适合初学者和有经验的开发者学习。