.NET 视图组件(ViewComponent)教程大全

.NET 8 视图组件教程

1. 引言

  • 什么是视图组件
  • 为什么使用视图组件

2. 创建视图组件

  • 视图组件的命名规则
  • 如何定义 Invoke 或 InvokeAsync 方法
  • 如何从 ViewComponent 基类派生
  • 如何使用 ViewComponent 属性

3. 使用视图组件

  • 如何在视图中调用视图组件
  • 如何传递参数到视图组件

4. 视图组件的位置

  • 视图组件应该放在哪里
  • 为什么我们通常把它们放在 Components 文件夹中

5. 示例:CitySummary 视图组件

  • 创建 CitySummary 视图组件
  • CitySummary 视图组件的内容
  • 如何使用 CitySummary 视图组件

6. 获取上下文数据

  • 如何在视图组件中获取上下文数据
  • 示例:使用 ViewComponent 属性获取上下文数据

7. 使用理由

  • 视图组件的优点
  • 视图组件的适用场景

8. 视图组件的视图

9. 测试视图组件

10. 视图组件的参数

11. 视图组件的生命周期

12. 视图组件的异步支持

13. 视图组件的依赖注入

14. 视图组件的布局

15. 视图组件的部分视图

16. 视图组件的错误处理

17. 视图组件的日志记录

18. 视图组件的过滤器

19. 视图组件的路由

20. 视图组件的安全性

21. 视图组件的局部更新

22. 视图组件的性能优化

23. 视图组件的嵌套使用

24. 视图组件的模型绑定

25. 视图组件的身份验证和授权

26. 视图组件的本地化

27. 视图组件的单元测试

28. 视图组件的数据验证

29. 视图组件的会话和应用状态

30. 视图组件的事件处理

31. 视图组件的自定义视图引擎

32. 视图组件的模型

33. 视图组件的自定义标签助手

34. 视图组件的自定义 HTML 助手

35. 视图组件的自定义 HTML 编码

36. 视图组件的自定义数据注入

37. 视图组件的自定义数据注解

38. 视图组件的自定义视图数据

39. 视图组件的自定义视图导入

40. 视图组件的自定义视图启动

41. 视图组件的自定义视图定位器

42. 视图组件的自定义视图编译器

43. 视图组件的自定义视图选项

44. 视图组件的自定义视图解析器

45. 视图组件的自定义视图页

46. 视图组件的自定义视图模型

47. 视图组件的自定义视图引擎选项

48. 视图组件的自定义视图结果

49. 视图组件的自定义视图引擎工厂

50. 视图组件的自定义视图引擎提供者

51. 视图组件的自定义视图引擎缓存

52. 视图组件的自定义视图引擎结果

53. 视图组件的自定义视图引擎选项提供者

54. 视图组件的自定义视图引擎选项工厂

55. 视图组件的自定义视图引擎选项解析器

56. 视图组件的自定义视图引擎选项验证器

57. 视图组件的自定义视图引擎选项解析器工厂

58. 视图组件的自定义视图引擎选项解析器提供者

59. 视图组件的自定义视图引擎选项验证器工厂

60. 视图组件的自定义视图引擎选项验证器提供者

1. 引言

视图组件是 ASP.NET Core MVC 框架的一部分,它可以帮助我们创建可重用的视图模块。视图组件类似于部分视图,但它们更强大,因为它们可以有自己的模型并且可以接收参数。

2. 创建视图组件

视图组件是一个 C# 类,它继承自 ViewComponent 基类。这个类需要定义一个 InvokeInvokeAsync 方法,这个方法是视图组件的入口点。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(int maxPriority, bool isDone){var items = _context.ToDo.Where(x => x.IsDone == isDone &&x.Priority <= maxPriority);return View(items);}
}

在这个例子中,MyViewComponent 是一个视图组件,它接收两个参数 maxPriorityisDone,然后返回一个视图,并传递一个模型给这个视图。

3. 使用视图组件

要在视图中使用视图组件,你可以使用 @await Component.InvokeAsync 方法。例如:

<div>@await Component.InvokeAsync("My", new { maxPriority = 3, isDone = false })
</div>

在这个例子中,我们在视图中调用了 My 视图组件,并传递了两个参数 maxPriorityisDone

4. 视图组件的位置

视图组件可以在项目中的任何地方定义,但是惯例是将它们分组放在一个名为 Components 的文件夹中。例如,你可以在 WebApp/Components 文件夹中创建一个名为 CitySummary.cs 的视图组件。

namespace WebApp.Components
{public class CitySummary : ViewComponent{private readonly ICityData _cityData;public CitySummary(ICityData cityData){_cityData = cityData;}public IViewComponentResult Invoke(){var model = _cityData.GetSummary();return View(model);}}
}

在这个例子中,CitySummary 视图组件使用了 ICityData 服务来获取城市的摘要信息,然后将这些信息传递给视图。

5. 获取上下文数据

视图组件可以访问上下文数据,例如请求的路由数据、查询字符串参数等。你可以通过 ViewComponent 基类的 ViewContext 属性来获取这些数据。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(){var routeData = ViewContext.RouteData.Values;// 使用路由数据}
}

在这个例子中,我们获取了当前请求的路由数据,并可以根据这些数据来改变视图组件的行为。

6. 示例:CitySummary 视图组件

让我们创建一个名为 CitySummary 的视图组件,它将显示城市的总结信息。首先,我们需要在 WebApp/Components 文件夹中创建一个名为 CitySummary.cs 的文件,内容如下:

public class CitySummary : ViewComponent
{private readonly CityService _cityService;public CitySummary(CityService cityService){_cityService = cityService;}public IViewComponentResult Invoke(){var model = _cityService.GetSummary();return View(model);}
}

在这个例子中,CitySummary 视图组件使用了 CityService 服务来获取城市的摘要信息,然后将这些信息传递给视图。

7. 使用理由

视图组件是 ASP.NET Core MVC 框架的强大工具,它们可以帮助我们创建可重用的视图模块。通过使用视图组件,我们可以将复杂的视图逻辑分解为更小、更易于管理的部分,从而提高代码的可读性和可维护性。

8. 视图组件的视图

每个视图组件都有一个与之关联的视图,它是一个 Razor 视图文件,用于定义视图组件的 HTML 输出。例如,CitySummary 视图组件的视图可能位于 Views/Shared/Components/CitySummary/Default.cshtml 文件中,内容如下:

@model CitySummaryModel<div class="city-summary"><h2>@Model.CityName</h2><p>Population: @Model.Population</p><p>Area: @Model.Area km²</p>
</div>

在这个例子中,我们定义了一个简单的视图,它显示城市的名称、人口和面积。

9. 测试视图组件

视图组件可以像控制器和服务一样进行单元测试。你可以创建一个视图组件的实例,调用它的 InvokeInvokeAsync 方法,然后检查返回的 IViewComponentResult。例如:

[Fact]
public void Invoke_ReturnsCorrectModel()
{// Arrangevar cityService = new Mock<CityService>();cityService.Setup(s => s.GetSummary()).Returns(new CitySummaryModel());var viewComponent = new CitySummary(cityService.Object);// Actvar result = viewComponent.Invoke();// Assertvar viewResult = Assert.IsType<ViewViewComponentResult>(result);var model = Assert.IsType<CitySummaryModel>(viewResult.ViewData.Model);
}

在这个例子中,我们使用了 Moq 库来模拟 CityService,然后我们创建了 CitySummary 视图组件的一个实例,并调用了它的 Invoke 方法。最后,我们检查了返回的视图结果和模型。

10. 视图组件的参数

视图组件的 InvokeInvokeAsync 方法可以接收任意数量和类型的参数。这些参数可以是简单的值类型,也可以是复杂的引用类型。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(string param1, int param2, MyModel param3){// 使用参数}
}

在这个例子中,Invoke 方法接收了三个参数:一个字符串、一个整数和一个 MyModel 对象。你可以根据需要来定义你的参数。

11. 视图组件的生命周期

视图组件的生命周期与控制器的生命周期类似。当 ASP.NET Core 处理一个请求时,它会创建一个新的视图组件实例,然后调用它的 InvokeInvokeAsync 方法。当方法执行完毕,视图组件的实例就会被销毁。这意味着你不能在视图组件的实例之间共享数据,除非你使用了服务或数据库。

12. 视图组件的异步支持

视图组件支持异步操作,这意味着你可以在 InvokeAsync 方法中执行耗时的操作,例如数据库查询或网络请求,而不会阻塞用户的请求。例如:

public class MyViewComponent : ViewComponent
{private readonly MyService _myService;public MyViewComponent(MyService myService){_myService = myService;}public async Task<IViewComponentResult> InvokeAsync(int id){var model = await _myService.GetAsync(id);return View(model);}
}

在这个例子中,我们在 InvokeAsync 方法中调用了 _myService.GetAsync 方法,这是一个异步方法,它可能会执行一些耗时的操作。

13. 视图组件的依赖注入

视图组件支持依赖注入,这意味着你可以在视图组件的构造函数中接收任何已注册到 ASP.NET Core 依赖注入系统的服务。例如:

public class MyViewComponent : ViewComponent
{private readonly MyService _myService;public MyViewComponent(MyService myService){_myService = myService;}public IViewComponentResult Invoke(){var model = _myService.Get();return View(model);}
}

在这个例子中,我们在 MyViewComponent 的构造函数中接收了一个 MyService 实例,然后在 Invoke 方法中使用这个服务来获取模型。

14. 视图组件的布局

视图组件的视图可以使用布局,就像常规的 MVC 视图一样。你可以在视图中使用 _Layout 属性来指定布局。例如:

@{Layout = "_Layout";
}<div class="my-view-component"><!-- 视图组件的内容 -->
</div>

在这个例子中,我们为视图组件的视图指定了一个名为 _Layout 的布局。

15. 视图组件的部分视图

视图组件的视图可以包含部分视图,就像常规的 MVC 视图一样。你可以使用 Html.PartialHtml.PartialAsync 方法来渲染部分视图。例如:

<div class="my-view-component">@Html.Partial("_Partial", Model)
</div>

在这个例子中,我们在视图组件的视图中渲染了一个名为 _Partial 的部分视图,并传递了模型给这个部分视图。

16. 视图组件的错误处理

视图组件可以处理错误,就像常规的 MVC 控制器一样。你可以在 InvokeInvokeAsync 方法中使用 try/catch 块来捕获和处理错误。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(){try{// 正常的操作}catch (Exception ex){// 错误处理}}
}

在这个例子中,我们在 Invoke 方法中使用了 try/catch 块来捕获和处理可能发生的错误。

17. 视图组件的日志记录

视图组件可以记录日志,就像常规的 MVC 控制器一样。你可以在视图组件的构造函数中接收一个 ILogger 实例,然后在 InvokeInvokeAsync 方法中使用这个 ILogger 来记录日志。例如:

public class MyViewComponent : ViewComponent
{private readonly ILogger _logger;public MyViewComponent(ILogger<MyViewComponent> logger){_logger = logger;}public IViewComponentResult Invoke(){_logger.LogInformation("Invoke method called.");// 正常的操作}
}

在这个例子中,我们在 MyViewComponent 的构造函数中接收了一个 ILogger 实例,然后在 Invoke 方法中使用这个 ILogger 来记录日志。

18. 视图组件的过滤器

视图组件不支持 MVC 中的过滤器。这是因为视图组件是独立于请求生命周期的,它们在请求处理过程中的任何时间都可以被调用。如果你需要在视图组件中执行一些预处理或后处理操作,你可以在 InvokeInvokeAsync 方法中直接执行这些操作。

19. 视图组件的路由

视图组件不支持 MVC 中的路由。这是因为视图组件不是通过 URL 来访问的,而是通过在视图中调用 Component.InvokeAsync 方法来访问的。如果你需要在视图组件中获取路由数据,你可以通过 ViewContext 属性来获取。

20. 视图组件的安全性

视图组件的安全性主要依赖于它们如何被使用。如果你在视图组件中显示用户提供的数据,你应该确保这些数据已经被正确地编码,以防止跨站脚本攻击(XSS)。ASP.NET Core 的 Razor 视图引擎默认会对所有的输出进行 HTML 编码,所以你通常不需要自己来编码数据。

21. 视图组件的局部更新

视图组件可以被用于实现局部页面更新。你可以使用 AJAX 调用视图组件的 InvokeInvokeAsync 方法,然后将返回的 HTML 插入到页面中。例如:

$.get('/My/Invoke', function (html) {$('#my-view-component').html(html);
});

在这个例子中,我们使用 jQuery 的 $.get 方法来发送一个 AJAX 请求到 /My/Invoke,这个 URL 对应于 My 视图组件的 Invoke 方法。然后我们将返回的 HTML 插入到页面中的 #my-view-component 元素中。

22. 视图组件的性能优化

视图组件可能会执行一些耗时的操作,例如数据库查询或网络请求。为了提高性能,你可以考虑以下的优化策略:

  • 缓存:你可以使用 ASP.NET Core 的缓存功能来缓存视图组件的输出。这样,当多个用户请求相同的视图组件时,你只需要执行一次耗时的操作。

  • 异步:如果你的视图组件执行了 I/O 操作,例如数据库查询或网络请求,你应该使用异步方法来避免阻塞请求线程。

23. 视图组件的嵌套使用

视图组件可以嵌套使用,也就是说,一个视图组件的视图可以调用另一个视图组件。例如:

<div class="my-view-component">@await Component.InvokeAsync("Child")
</div>

在这个例子中,我们在 My 视图组件的视图中调用了 Child 视图组件。

24. 视图组件的模型绑定

视图组件不支持 MVC 中的模型绑定。这是因为视图组件不是通过 HTTP 请求来调用的,而是通过在视图中调用 Component.InvokeAsync 方法来调用的。如果你需要在视图组件中获取请求数据,你可以通过参数传递或通过 ViewContext 属性来获取。

25. 视图组件的身份验证和授权

视图组件不支持 MVC 中的身份验证和授权。这是因为视图组件是独立于请求生命周期的,它们在请求处理过程中的任何时间都可以被调用。如果你需要在视图组件中进行身份验证或授权,你可以在 InvokeInvokeAsync 方法中直接执行这些操作。

26. 视图组件的本地化

视图组件支持本地化,这意味着你可以根据用户的语言和文化设置来显示不同的内容。你可以在视图组件的构造函数中接收一个 IStringLocalizer 实例,然后在 InvokeInvokeAsync 方法中使用这个 IStringLocalizer 来获取本地化的字符串。例如:

public class MyViewComponent : ViewComponent
{private readonly IStringLocalizer _localizer;public MyViewComponent(IStringLocalizer<MyViewComponent> localizer){_localizer = localizer;}public IViewComponentResult Invoke(){var message = _localizer["Hello, world!"];// 使用本地化的字符串}
}

在这个例子中,我们在 MyViewComponent 的构造函数中接收了一个 IStringLocalizer 实例,然后在 Invoke 方法中使用这个 IStringLocalizer 来获取本地化的字符串。

27. 视图组件的单元测试

视图组件可以进行单元测试,就像常规的 MVC 控制器一样。你可以创建一个视图组件的实例,调用它的 InvokeInvokeAsync 方法,然后检查返回的 IViewComponentResult。例如:

[Fact]
public void Invoke_ReturnsCorrectModel()
{// Arrangevar cityService = new Mock<CityService>();cityService.Setup(s => s.GetSummary()).Returns(new CitySummaryModel());var viewComponent = new CitySummary(cityService.Object);// Actvar result = viewComponent.Invoke();// Assertvar viewResult = Assert.IsType<ViewViewComponentResult>(result);var model = Assert.IsType<CitySummaryModel>(viewResult.ViewData.Model);
}

在这个例子中,我们使用了 Moq 库来模拟 CityService,然后我们创建了 CitySummary 视图组件的一个实例,并调用了它的 Invoke 方法。最后,我们检查了返回的视图结果和模型。

28. 视图组件的数据验证

视图组件不支持 MVC 中的数据验证。这是因为视图组件不是通过 HTTP 请求来调用的,而是通过在视图中调用 Component.InvokeAsync 方法来调用的。如果你需要在视图组件中进行数据验证,你可以在 InvokeInvokeAsync 方法中直接执行这些操作。

29. 视图组件的会话和应用状态

视图组件不支持 MVC 中的会话和应用状态。这是因为视图组件是独立于请求生命周期的,它们在请求处理过程中的任何时间都可以被调用。如果你需要在视图组件中存储或检索会话或应用状态,你可以使用 ASP.NET Core 的分布式缓存或数据保护 API。

30. 视图组件的事件处理

视图组件不支持 MVC 中的事件处理。这是因为视图组件不是通过 HTTP 请求来调用的,而是通过在视图中调用 Component.InvokeAsync 方法来调用的。如果你需要在视图组件中处理事件,你可以在 InvokeInvokeAsync 方法中直接执行这些操作。

31. 视图组件的自定义视图引擎

视图组件支持自定义视图引擎,这意味着你可以改变视图组件的视图是如何被找到和渲染的。你可以实现 IViewEngine 接口来创建你自己的视图引擎,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngine, MyViewEngine>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎 MyViewEngine,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

32. 视图组件的模型

视图组件的模型就是它的视图所需要的数据。你可以在 InvokeInvokeAsync 方法中创建模型,然后将它传递给视图。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(){var model = new MyModel{Property1 = "Value1",Property2 = "Value2"};return View(model);}
}

在这个例子中,我们在 Invoke 方法中创建了一个 MyModel 实例,然后将它传递给了视图。

33. 视图组件的自定义标签助手

视图组件可以与自定义标签助手一起使用,以提供更清晰、更简洁的语法。你可以创建一个自定义标签助手,它生成一个调用视图组件的 Razor 表达式。例如:

[HtmlTargetElement("my-view-component")]
public class MyViewComponentTagHelper : TagHelper
{public override void Process(TagHelperContext context, TagHelperOutput output){output.TagName = "div";output.Content.SetHtmlContent("@await Component.InvokeAsync(\"My\")");}
}

在这个例子中,我们创建了一个自定义标签助手 MyViewComponentTagHelper,它生成了一个调用 My 视图组件的 Razor 表达式。

34. 视图组件的自定义 HTML 助手

视图组件可以与自定义 HTML 助手一起使用,以提供更清晰、更简洁的语法。你可以创建一个自定义 HTML 助手,它生成一个调用视图组件的 Razor 表达式。例如:

public static class HtmlHelperExtensions
{public static IHtmlContent MyViewComponent(this IHtmlHelper htmlHelper){return htmlHelper.Raw("@await Component.InvokeAsync(\"My\")");}
}

在这个例子中,我们创建了一个自定义 HTML 助手 MyViewComponent,它生成了一个调用 My 视图组件的 Razor 表达式。

35. 视图组件的自定义 HTML 编码

视图组件支持自定义 HTML 编码,这意味着你可以改变视图组件的视图是如何被编码的。你可以实现 IHtmlEncoder 接口来创建你自己的 HTML 编码器,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IHtmlEncoder, MyHtmlEncoder>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的 HTML 编码器 MyHtmlEncoder,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

36. 视图组件的自定义数据注入

视图组件支持自定义数据注入,这意味着你可以在视图组件的视图中注入任何已注册到 ASP.NET Core 依赖注入系统的服务。你可以在视图中使用 @inject 指令来注入服务。例如:

@inject MyService MyService<div class="my-view-component">@MyService.Get()
</div>

在这个例子中,我们在视图中注入了一个 MyService 实例,然后在视图中使用这个服务来获取数据。

37. 视图组件的自定义数据注解

视图组件支持自定义数据注解,这意味着你可以在视图组件的模型中使用数据注解来进行数据验证和格式化。例如:

public class MyModel
{[Required][StringLength(100)]public string Property1 { get; set; }[Range(0, 100)]public int Property2 { get; set; }
}

在这个例子中,我们在 MyModel 类中使用了 RequiredStringLengthRange 数据注解来进行数据验证。

38. 视图组件的自定义视图数据

视图组件支持自定义视图数据,这意味着你可以在视图组件的视图中使用 ViewDataViewBag 来传递数据。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(){ViewData["Message"] = "Hello, world!";return View();}
}

在这个例子中,我们在 Invoke 方法中设置了 ViewDataMessage 属性,然后在视图中可以使用这个属性。

39. 视图组件的自定义视图导入

视图组件支持自定义视图导入,这意味着你可以在视图组件的视图中导入任何需要的命名空间。你可以在 _ViewImports.cshtml 文件中添加 @using 指令来导入命名空间。例如:

@using MyNamespace

在这个例子中,我们在 _ViewImports.cshtml 文件中导入了 MyNamespace 命名空间,然后在视图中可以使用这个命名空间中的类型。

40. 视图组件的自定义视图启动

视图组件支持自定义视图启动,这意味着你可以在视图组件的视图中设置任何需要的视图启动代码。你可以在 _ViewStart.cshtml 文件中添加任何 Razor 代码。例如:

@{Layout = "_Layout";
}

在这个例子中,我们在 _ViewStart.cshtml 文件中设置了布局,然后在视图中可以使用这个布局。

41. 视图组件的自定义视图定位器

视图组件支持自定义视图定位器,这意味着你可以改变视图组件的视图是如何被找到的。你可以实现 IViewLocationExpander 接口来创建你自己的视图定位器,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.Configure<RazorViewEngineOptions>(options =>{options.ViewLocationExpanders.Add(new MyViewLocationExpander());});// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图定位器 MyViewLocationExpander,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

42. 视图组件的自定义视图编译器

视图组件支持自定义视图编译器,这意味着你可以改变视图组件的视图是如何被编译的。你可以实现 IViewCompiler 接口来创建你自己的视图编译器,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewCompiler, MyViewCompiler>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图编译器 MyViewCompiler,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

43. 视图组件的自定义视图选项

视图组件支持自定义视图选项,这意味着你可以改变视图组件的视图的一些行为。你可以在 Startup 类中配置 RazorViewEngineOptions 来设置视图选项。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.Configure<RazorViewEngineOptions>(options =>{options.AllowRecompilingViewsOnFileChange = true;});// 其他的服务配置}
}

在这个例子中,我们在 Startup 类的 ConfigureServices 方法中配置了 RazorViewEngineOptions,并设置了 AllowRecompilingViewsOnFileChange 选项。

44. 视图组件的自定义视图解析器

视图组件支持自定义视图解析器,这意味着你可以改变视图组件的视图是如何被解析的。你可以实现 IViewResolver 接口来创建你自己的视图解析器,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewResolver, MyViewResolver>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图解析器 MyViewResolver,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

45. 视图组件的自定义视图页

视图组件支持自定义视图页,这意味着你可以为视图组件创建自己的视图页。你可以在 Views/Shared/Components 目录下创建一个与视图组件同名的 Razor 视图文件。例如:

@model MyModel<div class="my-view-component">@Model.Property1
</div>

在这个例子中,我们为 My 视图组件创建了一个 Razor 视图文件,然后在这个视图中显示了模型的 Property1 属性。

46. 视图组件的自定义视图模型

视图组件支持自定义视图模型,这意味着你可以为视图组件创建自己的视图模型。你可以在视图组件的 InvokeInvokeAsync 方法中创建视图模型,然后将它传递给视图。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(){var viewModel = new MyViewModel{Property1 = "Value1",Property2 = "Value2"};return View(viewModel);}
}

在这个例子中,我们在 Invoke 方法中创建了一个 MyViewModel 实例,然后将它传递给了视图。

47. 视图组件的自定义视图引擎选项

视图组件支持自定义视图引擎选项,这意味着你可以改变视图引擎的一些行为。你可以在 Startup 类中配置 RazorViewEngineOptions 来设置视图引擎选项。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.Configure<RazorViewEngineOptions>(options =>{options.CompilationCallback = context =>{var assembly = typeof(Startup).GetTypeInfo().Assembly;context.Compilation = context.Compilation.AddReferences(MetadataReference.CreateFromFile(assembly.Location));};});// 其他的服务配置}
}

在这个例子中,我们在 Startup 类的 ConfigureServices 方法中配置了 RazorViewEngineOptions,并设置了 CompilationCallback 选项。

48. 视图组件的自定义视图结果

视图组件支持自定义视图结果,这意味着你可以改变视图组件的视图是如何被渲染的。你可以实现 IView 接口来创建你自己的视图结果,然后在 InvokeInvokeAsync 方法中返回这个视图结果。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(){return new MyView();}
}

在这个例子中,我们在 Invoke 方法中创建了一个 MyView 实例,然后返回了这个视图结果。

49. 视图组件的自定义视图引擎工厂

视图组件支持自定义视图引擎工厂,这意味着你可以改变视图引擎是如何被创建的。你可以实现 IViewEngineFactory 接口来创建你自己的视图引擎工厂,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineFactory, MyViewEngineFactory>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎工厂 MyViewEngineFactory,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

50. 视图组件的自定义视图引擎提供者

视图组件支持自定义视图引擎提供者,这意味着你可以改变视图引擎是如何被提供的。你可以实现 IViewEngineProvider 接口来创建你自己的视图引擎提供者,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineProvider, MyViewEngineProvider>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎提供者 MyViewEngineProvider,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

51. 视图组件的自定义视图引擎缓存

视图组件支持自定义视图引擎缓存,这意味着你可以改变视图引擎的缓存行为。你可以实现 IViewEngineCache 接口来创建你自己的视图引擎缓存,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineCache, MyViewEngineCache>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎缓存 MyViewEngineCache,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

52. 视图组件的自定义视图引擎结果

视图组件支持自定义视图引擎结果,这意味着你可以改变视图引擎的结果行为。你可以实现 IViewEngineResult 接口来创建你自己的视图引擎结果,然后在 InvokeInvokeAsync 方法中返回这个视图引擎结果。例如:

public class MyViewComponent : ViewComponent
{public IViewComponentResult Invoke(){return new MyViewEngineResult();}
}

在这个例子中,我们在 Invoke 方法中创建了一个 MyViewEngineResult 实例,然后返回了这个视图引擎结果。

53. 视图组件的自定义视图引擎选项提供者

视图组件支持自定义视图引擎选项提供者,这意味着你可以改变视图引擎选项是如何被提供的。你可以实现 IViewEngineOptionsProvider 接口来创建你自己的视图引擎选项提供者,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsProvider, MyViewEngineOptionsProvider>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项提供者 MyViewEngineOptionsProvider,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

54. 视图组件的自定义视图引擎选项工厂

视图组件支持自定义视图引擎选项工厂,这意味着你可以改变视图引擎选项是如何被创建的。你可以实现 IViewEngineOptionsFactory 接口来创建你自己的视图引擎选项工厂,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsFactory, MyViewEngineOptionsFactory>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项工厂 MyViewEngineOptionsFactory,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

55. 视图组件的自定义视图引擎选项解析器

视图组件支持自定义视图引擎选项解析器,这意味着你可以改变视图引擎选项是如何被解析的。你可以实现 IViewEngineOptionsParser 接口来创建你自己的视图引擎选项解析器,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsParser, MyViewEngineOptionsParser>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项解析器 MyViewEngineOptionsParser,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

56. 视图组件的自定义视图引擎选项验证器

视图组件支持自定义视图引擎选项验证器,这意味着你可以改变视图引擎选项是如何被验证的。你可以实现 IViewEngineOptionsValidator 接口来创建你自己的视图引擎选项验证器,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsValidator, MyViewEngineOptionsValidator>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项验证器 MyViewEngineOptionsValidator,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

57. 视图组件的自定义视图引擎选项解析器工厂

视图组件支持自定义视图引擎选项解析器工厂,这意味着你可以改变视图引擎选项解析器是如何被创建的。你可以实现 IViewEngineOptionsParserFactory 接口来创建你自己的视图引擎选项解析器工厂,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsParserFactory, MyViewEngineOptionsParserFactory>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项解析器工厂 MyViewEngineOptionsParserFactory,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

58. 视图组件的自定义视图引擎选项解析器提供者

视图组件支持自定义视图引擎选项解析器提供者,这意味着你可以改变视图引擎选项解析器是如何被提供的。你可以实现 IViewEngineOptionsParserProvider 接口来创建你自己的视图引擎选项解析器提供者,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsParserProvider, MyViewEngineOptionsParserProvider>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项解析器提供者 MyViewEngineOptionsParserProvider,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

59. 视图组件的自定义视图引擎选项验证器工厂

视图组件支持自定义视图引擎选项验证器工厂,这意味着你可以改变视图引擎选项验证器是如何被创建的。你可以实现 IViewEngineOptionsValidatorFactory 接口来创建你自己的视图引擎选项验证器工厂,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsValidatorFactory, MyViewEngineOptionsValidatorFactory>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项验证器工厂 MyViewEngineOptionsValidatorFactory,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

60. 视图组件的自定义视图引擎选项验证器提供者

视图组件支持自定义视图引擎选项验证器提供者,这意味着你可以改变视图引擎选项验证器是如何被提供的。你可以实现 IViewEngineOptionsValidatorProvider 接口来创建你自己的视图引擎选项验证器提供者,然后在 Startup 类中将它添加到服务集合中。例如:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IViewEngineOptionsValidatorProvider, MyViewEngineOptionsValidatorProvider>();// 其他的服务配置}
}

在这个例子中,我们创建了一个自定义的视图引擎选项验证器提供者 MyViewEngineOptionsValidatorProvider,然后在 Startup 类的 ConfigureServices 方法中将它添加到了服务集合中。

能阅读到最后的各位都是精英。
QQ群:708877645
编程岛(Java C# Python .Net Spring JS TS Vue React Angular)欢迎你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 添加主键可以节省磁盘空间吗?

MySQL 表定义主键不是必须的&#xff0c;并且直到今天&#xff08;MySQL 版本 8.3.0&#xff09;都是这样。不过&#xff0c;在 MGR 和 PXC 架构中不允许使用没有主键的表。如果数据表没有主键&#xff0c;会有许多众所周知的负面性能影响&#xff0c;其中最痛苦的是复制速度很…

ROS 2基础概念#4:消息(Message)| ROS 2学习笔记

ROS 2消息简介 ROS程序使用三种不同的接口来进行沟通&#xff1a;消息&#xff08;message&#xff09;&#xff0c;服务&#xff08;service&#xff09;和动作&#xff08;action&#xff09;。ROS 2使用一种简化的描述语言&#xff1a;IDL&#xff08;interface definition…

Vue.js 深度解析:模板编译原理与过程

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

代码随想录算法训练营day36|435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 代码随想录 class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals.sort(keylambda x:x[0])result 0for i in range(1,len(intervals)):if intervals[i][0] < intervals[i-1][1]:result 1intervals[i][1] m…

【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

【python】堆排序

堆的概念 堆&#xff1a;一种特殊完全二叉树&#xff0c;也就是二叉树必须全部是满的&#xff0c;但是最后一排可以从右向左缺失。 大根堆&#xff1a;每个节点都比他的子节点大 小根堆&#xff1a;每个节点都比子节点小 堆在代码中的形式 堆在代码中实际上就是列表&#…

[Angular 基础] - routing 路由(下)

[Angular 基础] - routing 路由(下) 之前部分 Angular 笔记&#xff1a; [Angular 基础] - 自定义指令&#xff0c;深入学习 directive [Angular 基础] - service 服务 [Angular 基础] - routing 路由(上) 使用 route 书接上回&#xff0c;继续折腾 routing 按照最初的 wi…

【JavaScript】forEach() 会不会改变原数组?

forEach() forEach()方法需要一个函数作为参数。这种函数&#xff0c;是由我们创建但是不由我们调用的&#xff0c;我们称为回调函数。 数组中有几个元素&#xff0c;该回调函数就会执行几次。 回调函数中传递三个参数&#xff1a; 参数1&#xff1a;当前正在遍历的元素 参…

洛谷P1039题解

题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明明不知情的情况下&#xff09;&#xff0c;明明的任务就是找出这…

Linux--文件(2)-重定向和文件缓冲

命令行中的重定向符号 介绍和使用 在Linux的命令行中&#xff0c;重定向符号用于将命令的输入或输出重定向到文件或设备。 常见的重定向符号&#xff1a; 1.“>“符号&#xff1a;将命令的标准输出重定向到指定文件中&#xff0c;并覆盖原有的内容。 2.”>>“符号&a…

1.初识python

1.初识python 编程语言是用来定义计算机程序的语言&#xff0c;用来向计算机发出指令。 1.python语言是一种面向对象的解释型高级编程语言。 解释型语言&#xff1a;使用专门的解释器对源码程序逐行解释成特定平台的机器并立即执行&#xff0c;是代码在执行时才被解释器一行行…

c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题

1、单链表逆序 思路图 代码实现 //著: 链表结构里记得加 friend void ReverseLink(Clink& link); void ReverseLink(Clink& link) {Node* p link.head_->next_;while( p nullptr){return;}Node* q p->next_;link.head_->next_ nullptr;while(p ! nullpt…

YOLOv8改进 在更换的PoolFormer主干网络中增加注意力机制

一、PoolFormer的网络结构 PoolFormer采用自注意力机制和池化操作相结合的方式&#xff0c;同时考虑了局部和全局的特征关系。 具体的代码如&#xff08;YOLOv8改进 更换多层池化操作主干网络PoolFormer_yolov8池化-CSDN博客&#xff09;所示。 二、Global Attention Mechan…

python一张大图找小图的个数

python一张大图找小图的个数 一、背景 有时候我们在浏览网站时&#xff0c;发现都是前端搞出来的一张张图&#xff0c;我们只能用盯住屏幕的小眼睛看着&#xff0c;很累的统计&#xff0c;这个是我在项目中发现没办法统计&#xff0c;网上的教程很多&#xff0c;都不成功&…

Python 面向对象编程——类的使用

一、学习目标 1&#xff0e;掌握类的定义和实例化对象。 2&#xff0e;熟练掌握类的构造函数__init__使用。 3&#xff0e;掌握类的继承机制和使用。 二、相关练习 1、定义一个玩具类Toy()&#xff0c;创建名字为“小汽车”、“手枪”和“积木”的玩具实例&#xff0c;计…

深圳牵头打造鸿蒙原生应用软件生态 | 百能云芯

深圳市工业和信息化局、深圳市政务服务和数据管理局于3月3日联合印发了《深圳市支持开源鸿蒙原生应用发展2024年行动计划》。这一计划旨在通过政策引导、市场推动、社会协同的方式&#xff0c;将深圳打造成一个鸿蒙原生应用软件生态的中心&#xff0c;推动鸿蒙系统在当地的发展…

[设计模式]责任链模式实现 申请聚餐费用流程

来考虑这样一个功能:申请聚餐费用的管理。   很多公司都是这样的福利&#xff0c;就是项目组或者是部门可以向公司申请一些聚餐费用&#xff0c;用于组织项目组成员或者是部门成员进行聚餐活动。   申请聚餐费用的大致流程一般是&#xff1a;由申请人先填写申请单&#xff…

PyQT6的从零开始在Pycharm中配置与使用

PyQT6的从零开始在Pycharm中配置与使用 1.安装PyQt6 PyQt6-tools2.在Pycharm中配置扩展工具2.1配置QTdesigner2.2配置Pyuic 3.启动3.1、启动designer3.2、启动Pyuic 1.安装PyQt6 PyQt6-tools pip install PyQt6 PyQt6-tools安装成功后&#xff0c;查看安装版本&#xff0c;版本…

基于springboot+vue的医疗报销系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

面试笔记系列四之SpringBoot+SpringCloud+计算机网络基础知识点整理及常见面试题

目录 Spring Boot 什么是 Spring Boot&#xff1f; Spring Boot 有哪些优点&#xff1f; SpringBootApplication注解 Spring Boot 的启动流程 Spring Boot属性加载顺序 springboot自动配置原理是什么&#xff1f;&#xff08;*&#xff09; 如何理解springboot中的start…