news 2026/4/16 0:52:10

ASP.NET Core面试精讲系列三

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ASP.NET Core面试精讲系列三

目录

31. ASP.NET Core 中的 MVC 是什么?与“老版”ASP.NET 的 MVC 有何不同?

MVC 的定义

ASP.NET Core MVC 与 ASP.NET MVC 的主要区别

32. 什么是 Razor Pages?何时使用 Razor Pages 而不是 MVC?

推荐使用 Razor Pages 的场景

推荐使用 MVC 的场景

33. MVC / Razor Pages 的路由机制

34. Controller、Action、View 和 View Component

35. Tag Helper 与 HTML Helper 的区别

36. ViewData、ViewBag、TempData 的区别与用途

示例

37. MVC/Razor Pages 的模型绑定

38. 使用数据注解进行模型验证

39. 自定义验证(IValidatableObject、自定义验证器)

40. 布局、部分视图、视图组件

41. 从控制器向视图如何传递数据

42. ASP.NET Core MVC 中的过滤器类型及其生命周期

过滤器的应用方式

43. Razor Page 处理器(OnGet、OnPost 等)

常见处理器方法

自定义处理器

44. Razor Pages 的依赖注入

45. Razor 类库(RCL)

46. MVC 的 Area

47. 静态资源组织、打包与压缩

48. 支持多视图引擎 / 自定义视图引擎

49. 视图中的本地化(Localization)与全球化(Globalization)

50. Razor Pages 与 MVC 的性能对比


上一篇

31. ASP.NET Core 中的 MVC 是什么?与“老版”ASP.NET 的 MVC 有何不同?


MVC 的定义

  • MVC(模型-视图-控制器)是一种经典的三层模式:

    • Model(模型):封装数据与业务逻辑

    • View(视图):负责 UI 渲染

    • Controller(控制器):处理请求与应用流程

  • 优点:实现关注点分离,便于维护与测试。


ASP.NET Core MVC 与 ASP.NET MVC 的主要区别

特性

ASP.NET MVC(旧版)

ASP.NET Core MVC

平台

仅限 Windows / .NET Framework

跨平台 (.NET Core/.NET 5+)

依赖注入

需要第三方容器

内置依赖注入

MVC & Web API

两套独立框架

已统一为一个管道

请求处理

基于 System.Web / HttpHandler

基于 Middleware 中间件管道

性能

较重,依赖 IIS

轻量级,高性能,可自托管

配置

Web.config

appsettings.json + 强类型配置

部署

IIS 为主

Kestrel,自托管,跨平台部署


32. 什么是 Razor Pages?何时使用 Razor Pages 而不是 MVC?

  • Razor Pages是 ASP.NET Core 2.0 引入的基于页面的编程模型,建立在 MVC 框架之上。

  • 每个.cshtml文件对应一个PageModel类,负责处理请求逻辑(类似于控制器 + 视图的结合)。

  • 特点:代码组织更直观,样板代码更少,适合页面驱动的开发模式。


推荐使用 Razor Pages 的场景

  • 以页面为中心的应用

  • CRUD 类型的后台管理系统

  • 表单驱动的 UI 界面

  • 中小型项目,追求简洁性

推荐使用 MVC 的场景

  • 大型、复杂、模块化应用

  • 基于控制器和路由的清晰分层结构

  • 需要构建 API 与多端交互的项目

  • 团队协作开发、需要严格分层时


33. MVC / Razor Pages 的路由机制

  • MVC 路由:

    • 支持属性路由和传统路由

    • 示例:

endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
  • Razor Pages 路由:

    • 基于文件夹结构

    • 例如:URL/Products/Edit映射到/Pages/Products/Edit.cshtml


34. Controller、Action、View 和 View Component

  • Controller(控制器):处理 HTTP 请求

  • Action(方法):控制器中的方法,返回结果(如视图或 JSON)

  • View(视图).cshtml文件,渲染 HTML

  • View Component(视图组件):带有逻辑的可复用小型视图(类似带代码的部分视图)


35. Tag Helper 与 HTML Helper 的区别

  • Tag Helper:HTML 风格语法,易读易维护

<form asp-controller="Home" asp-action="Login"></form>
  • HTML Helper:Razor 中的 C# 方法

@Html.BeginForm("Login", "Home")
  • 建议:现代 ASP.NET Core 应用优先使用 Tag Helper


36. ViewData、ViewBag、TempData 的区别与用途

类型

生命周期

动态类型

用途

ViewData

当前请求(存放在字典)

向视图传递数据,基于键值访问

ViewBag

当前请求(ViewData 包装器)

ViewData 的动态包装器,语法更简洁

TempData

跨请求(依赖 Session/Cookie,读取一次后即清除)

在重定向后临时保存数据,如提示消息


示例

// Controller ViewData["Count"] = 5; ViewBag.Message = "Hello"; TempData["Success"] = "保存成功"; return RedirectToAction("Index");

37. MVC/Razor Pages 的模型绑定

  • 定义ASP.NET Core 的模型绑定会自动将HTTP 请求中的数据(如表单字段、查询字符串、路由数据、请求体、Header、Cookie)映射到控制器方法参数或模型对象上。

public IActionResult Submit(User user) { ... }
  • 支持的数据类型

    • 简单类型:intstringboolDateTime

    • 复杂类型:自定义类、集合、嵌套对象

    • 特殊类型:IFormFile、枚举、字典

  • 数据来源属性

    • [FromQuery]:查询字符串

    • [FromRoute]:路由参数

    • [FromForm]:表单字段

    • [FromBody]:请求体(如 JSON/XML)

    • [FromHeader]:请求头

  • 验证配合

    • 模型绑定完成后,会自动触发数据注解验证和IValidatableObject.Validate()方法

    • 验证结果存入ModelState


38. 使用数据注解进行模型验证

  • 在模型属性上添加注解

public class User { [Required(ErrorMessage = "邮箱必填")] [EmailAddress(ErrorMessage = "邮箱格式不正确")] public string Email { get; set; } [Range(18, 60, ErrorMessage = "年龄必须在 18~60 岁之间")] public int Age { get; set; } }
  • 验证触发时机

    • 在模型绑定完成后,ASP.NET Core 会自动执行注解验证

    • 验证结果存放在ModelState

    • 控制器中可用ModelState.IsValid检查:

if (!ModelState.IsValid) { return View(model); // 验证失败,返回错误 }
  • 常见注解

    • [Required][StringLength][Range][RegularExpression]

    • [EmailAddress][Phone][Url]

    • 以及自定义验证属性(继承ValidationAttribute

  • 客户端验证(可选)

    • 配合 jQuery Validation + Unobtrusive Validation,可以在页面端自动生成data-val-*属性,实现前端即时验证


39. 自定义验证(IValidatableObject、自定义验证器)

  1. IValidatableObject(跨属性验证)

    示例:

    • 用于在模型类中实现复杂或多属性关联的验证逻辑

    • 实现接口:IValidatableObject

    • 需实现方法:IEnumerable<ValidationResult> Validate(ValidationContext context)

public classUserModel : IValidatableObject { publicstring Email { get; set; } publicint Age { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext context) { if (Age < 18) { yield return new ValidationResult( "年龄必须大于 18", new[] { nameof(Age) } ); } } }
  1. 自定义验证属性(ValidationAttribute)

    示例:

    • 适用于单个属性的自定义验证

    • 通过继承ValidationAttribute并重写IsValid方法实现

public classMyCustomAttribute : ValidationAttribute { public override bool IsValid(object value) { if (valueisstring str && !string.IsNullOrEmpty(str)) { return str.StartsWith("A"); // 必须以 A 开头 } returnfalse; } public override string FormatErrorMessage(string name) { return$"{name} 必须以字母 A 开头"; } } public class Product { [MyCustom] publicstring Code { get; set; } }
  1. 验证触发时机

    • 属性上的ValidationAttribute

    • 模型类中的IValidatableObject.Validate()

    • ASP.NET Core 在模型绑定ModelState验证时自动触发


40. 布局、部分视图、视图组件

  • 布局(Layout)

    • 用于定义共享结构(如头部、底部、导航栏)

    • 默认文件:_Layout.cshtml(放在Views/Shared/

    • 配置方式:

@{ Layout = "_Layout"; }
  • 部分视图(Partial View)

    • 可复用的 UI 片段(如_LoginPartial.cshtml

    • 调用方式:

@await Html.PartialAsync("_LoginPartial") @await Html.PartialAsync("_LoginPartial", model)
  • 视图组件(View Component)

    • 类似于小型 Controller,包含逻辑并返回视图片段

    • 示例:

public class CartViewComponent : ViewComponent { public IViewComponentResult Invoke() => View("Cart", model); }

- 调用方式:

@await Component.InvokeAsync("Cart", new { userId = 1 })

41. 从控制器向视图如何传递数据

  • Model(强类型,推荐)控制器中传递模型对象到视图:

public IActionResult Index() { var model = new MyViewModel { Name = "Alice" }; return View(model); }

视图中接收并使用模型:

@model MyViewModel <h1>@Model.Name</h1>
  • ViewBag(动态属性)控制器中设置:

ViewBag.Message = "Hello";

视图中使用:

<p>@ViewBag.Message</p>
  • ViewData(字典存储)控制器中设置:

ViewData["Count"] = 5;

视图中使用:

<p>@ViewData["Count"]</p>
  • TempData(跨请求传递数据)控制器中设置并重定向:

TempData["Success"] = "保存成功"; return RedirectToAction("Index");

视图中使用:

<p>@TempData["Success"]</p>

42. ASP.NET Core MVC 中的过滤器类型及其生命周期

ASP.NET Core MVC 中,过滤器一共有5 大类

  1. Authorization Filter(授权过滤器)

    • 在执行Action 之前运行

    • 用于认证、权限检查

    • 接口:IAuthorizationFilter/IAsyncAuthorizationFilter

  2. Resource Filter(资源过滤器)

    • 授权通过之后、Action 执行之前运行

    • 常用于缓存、请求短路

    • 接口:IResourceFilter/IAsyncResourceFilter

  3. Action Filter(操作过滤器)

    • Action 方法调用前后运行

    • 可用于日志、参数校验等

    • 接口:IActionFilter/IAsyncActionFilter

  4. Result Filter(结果过滤器)

    • ActionResult 执行前后触发

    • 不局限于视图结果,如ViewResultJsonResultFileResultObjectResult

    • 接口:IResultFilter/IAsyncResultFilter

  5. Exception Filter(异常过滤器)

    • Action 或 Result 执行过程中出现未捕获异常时触发

    • 仅限MVC 管道内的异常(不包括中间件层)

    • 接口:IExceptionFilter/IAsyncExceptionFilter

过滤器的应用方式

  1. 全局应用Program.csStartup.cs中注册:

services.AddControllers(options => { options.Filters.Add<LogActionFilter>(); // 或 new LogActionFilter() });
  1. 特性应用(需要继承 Attribute)

[LogActionFilter] public class HomeController : Controller { public IActionResult Index() => View(); }
  1. ServiceFilter 应用(支持依赖注入)

[ServiceFilter(typeof(LogActionFilter))] public IActionResult About() => View();
  1. TypeFilter 应用(支持构造函数参数)

[TypeFilter(typeof(LogActionFilter), Arguments = new object[] { "参数值" })] public IActionResult Contact() => View();

43. Razor Page 处理器(OnGet、OnPost 等)

  • Razor Pages 使用处理器方法来响应请求:

public class IndexModel : PageModel { public void OnGet() { // 处理 GET 请求 } public IActionResult OnPost() { // 处理 POST 请求 return RedirectToPage("Success"); } }

常见处理器方法

  • OnGet / OnGetAsync:处理HTTP GET

  • OnPost / OnPostAsync:处理HTTP POST

  • OnPut / OnPutAsync:处理HTTP PUT

  • OnDelete / OnDeleteAsync:处理HTTP DELETE

  • OnPatch / OnPatchAsync:处理HTTP PATCH

    支持同步或异步(推荐使用Async后缀版本)

自定义处理器

  • 可以通过Handler 名称区分多个方法:

public IActionResult OnPostUpdate() { ... } public IActionResult OnPostDelete() { ... }
  • 页面中通过asp-page-handler指定调用哪个处理器:

<form method="post" asp-page-handler="Update"> <button type="submit">更新</button> </form> <form method="post" asp-page-handler="Delete"> <button type="submit">删除</button> </form>

44. Razor Pages 的依赖注入

  • 在 PageModel 构造函数中注入服务(常见方式):

public class IndexModel : PageModel { private readonly IMyService _service; public IndexModel(IMyService service) { _service = service; } }
  • 在处理方法中注入服务(通过[FromServices]):

public IActionResult OnGet([FromServices] IMyService service) { service.DoSomething(); return Page(); }
  • 在 Razor 视图中通过@inject注入服务

@inject ILogger<IndexModel> Logger <p>@Logger.GetType().Name</p>

语法:@inject ServiceType VariableName


45. Razor 类库(RCL)

  • RCL(Razor Class Library)是 ASP.NET Core 支持的一种可复用类库,能够包含:

    • Razor 视图(Views)、页面(Pages)

    • Blazor 组件

    • 静态文件(需放在wwwroot文件夹下)

  • 主要用途: 用于在多个项目间共享UI 组件、页面和静态资源

  • 静态文件访问方式: RCL 中的静态文件通过如下路径访问:

_content/{库名}/{文件路径}
  • 创建 RCL 的命令

dotnet new razorclasslib --support-pages-and-views

默认创建的是 Blazor 组件库,如需支持 MVC / Razor Pages,请加上--support-pages-and-views参数。


46. MVC 的 Area

  • Area用于将大型应用按模块划分(如AdminCustomer),方便管理 Controllers、Views、Models。

  • 每个 Area 必须位于Areas/{AreaName}/文件夹下,并包含自己的Controllers/Views/Models

[Area("Admin")] public class DashboardController : Controller { public IActionResult Index() => View(); }
  • 启用 Area 需要在路由配置中添加规则:

app.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

47. 静态资源组织、打包与压缩

  • 静态资源存放位置默认放在wwwroot/文件夹中,通过app.UseStaticFiles()对外公开。

    在 .NET 6+,写在Program.cs;在 .NET 5 及之前,写在Startup.cs

  • 自定义静态文件夹可以配置额外路径:

app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), RequestPath = "/Static" });
  • 打包与压缩方式

    • WebOptimizer:ASP.NET Core 常用打包/压缩库

    • Gulp / Webpack:前端常用构建工具

    • ResponseCompressionMiddleware:启用 gzip / brotli 压缩传输

app.UseResponseCompression();

48. 支持多视图引擎 / 自定义视图引擎

  • ASP.NET Core 默认视图引擎:Razor

    ASP.NET Core 仅内置 Razor 视图引擎,不再支持 WebForms 或 ASPX。

  • 自定义/扩展视图引擎: 可通过实现IViewEngine接口添加或替换视图引擎。例如:

public class MyCustomViewEngine : IViewEngine { public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage) { // 实现自定义视图查找逻辑 return ViewEngineResult.NotFound(viewName, Array.Empty<string>()); } public ViewEngineResult GetView(string executingFilePath, string viewPath, bool isMainPage) { // 实现自定义视图获取逻辑 return ViewEngineResult.NotFound(viewPath, Array.Empty<string>()); } }
  • 注册自定义视图引擎

services.Configure<MvcViewOptions>(options => { options.ViewEngines.Clear(); // 可选:移除默认 Razor options.ViewEngines.Add(new MyCustomViewEngine()); });
  • 常见应用场景

    • 从数据库或远程服务动态加载视图

    • 支持非 Razor 模板语法(如 Handlebars、Mustache 等)

    • 修改 Razor 默认的视图查找规则


49. 视图中的本地化(Localization)与全球化(Globalization)

  • 服务注入

    • 在控制器或服务层使用IStringLocalizer<T>

    • 在 Razor 视图中使用IViewLocalizer(根据视图路径自动匹配资源文件)

@inject IViewLocalizer Localizer <h1>@Localizer["Welcome"]</h1>
  • 资源文件

    • Resources文件夹下创建.resx文件

    • 命名方式:按类名或视图路径命名,例如:

Resources/Views/Home/Index.en.resx Resources/Views/Home/Index.fr.resx Resources/Views/Home/Index.ja.resx
  • 不同语言使用不同后缀(如.en.resx.fr.resx.ja.resx

  • 本地化配置(Program.cs / Startup.cs)

services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddControllersWithViews() .AddViewLocalization() .AddDataAnnotationsLocalization(); var supportedCultures = new[] { "en", "fr", "ja" }; app.UseRequestLocalization(new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture("en"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCultures });

50. Razor Pages 与 MVC 的性能对比

  • 性能

    • Razor Pages 与 MVC 都基于ASP.NET Core MVC 框架和 Razor 视图引擎,底层实现相同

    • 性能几乎没有差异,影响性能的主要是数据访问、路由设计、模型绑定

  • 简洁性

    • Razor Pages 遵循“页面即端点”模式,适合 CRUD、表单驱动的 UI

    • 样板代码更少,开发体验更接近传统 WebForms

  • 可维护性

    • Razor Pages → 更直观,适合中小型、以页面为中心的应用

    • MVC → 控制器与视图分离更彻底,适合大型、模块化、团队协作的项目

引入地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 0:37:26

勾股定理简单学习

前言 若a和b是直角三角形的两条直角边&#xff0c;c是斜边&#xff0c;那么 a2b2c2a^{2}b^{2}c^{2}a2b2c2 勾股定理的图解法证明 勾股定理指出&#xff0c;在直角三角形中&#xff0c;斜边的平方等于两直角边的平方和&#xff0c;即 ( a2b2c2a^2 b^2 c^2a2b2c2)。以下是几种经…

作者头像 李华
网站建设 2026/4/10 16:18:27

从零开始安装并配置开源AI编程神器OpenCode

对于个人开发者而言&#xff0c;选择 OpenCode 国产开源编程模型 的组合&#xff0c;本质上是用开源工具 国产高性价比模型复刻了甚至超越了硅谷顶尖付费产品的AI编程体验。 让我们开始安装并使用开源AI编程神器OpenCode吧&#xff01; 一&#xff0c;第一步&#xff1a;环境…

作者头像 李华
网站建设 2026/4/11 2:53:33

充电即服务:智慧园区打造“人-车-桩”智能互联新体验

1、概述 园区停车场有电动汽车和电动自行车&#xff0c;均需要提供充电桩。充电桩管理系统通过物联网技术对接入系统的充电桩站点和各个充电桩进行不间断地数据采集和监控&#xff0c;解决园区充电桩使用、监控问题。电动自行车充电可采用投币、扫码充电方式&#xff0c;电动汽…

作者头像 李华
网站建设 2026/4/10 13:22:35

基于springBoot的动漫分享系统的设计与实现

背景与意义随着互联网技术的快速发展&#xff0c;动漫文化在全球范围内的影响力不断扩大。动漫爱好者群体日益壮大&#xff0c;对动漫资源的分享、讨论和收藏需求显著增加。传统的动漫分享方式如论坛、贴吧等存在信息分散、互动性不足、资源管理混乱等问题。基于SpringBoot的动…

作者头像 李华
网站建设 2026/4/11 7:45:45

全球生成式人工智能的安全合规前瞻

随着生成式人工智能&#xff08;GenAI&#xff09;技术的迅猛发展&#xff0c;其应用范围日益广泛&#xff0c;影响力逐渐增强。然而&#xff0c;技术的双刃剑效应也引发了各国对安全与合规的深度思考。美国、欧盟和韩国作为全球科技前沿的代表&#xff0c;纷纷出台了针对性的法…

作者头像 李华
网站建设 2026/4/10 17:33:55

大模型推理核心技术全解析:从原理到落地

一、什么是大模型推理&#xff1f; 大模型推理&#xff0c;本质是将训练/优化后的模型权重加载到硬件中&#xff0c;对用户输入的文本进行编码、计算&#xff0c;最终通过模型的生成逻辑输出目标结果的全过程&#xff0c;也是大模型发挥实际业务价值的核心环节。 这一环节与模…

作者头像 李华