经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET8 Blazor 从入门到精通:(三)类库和表单
来源:cnblogs  作者:二次元攻城狮  时间:2024/8/19 17:31:13  对本文有异议

Razor 类库

这里只对 RCL 创建和使用的做一些简单的概述,详细内容参考官方文档 使用 Razor 类库 (RCL) 中的 ASP.NET Core Razor 组件

创建

创建 Razor 类库跟创建普通类库步骤一样,关键步骤如下:

  • 从 ASP.NET Core 项目模板列表中选择“Razor 类库”
  • 在“其他信息”对话框中,请勿选择“支持页面和视图”

使用

在项目中使用 RCL 中组件的方法跟使用普通类库的方法一样:

  • 使用包含 RCL 命名空间的完整组件类型名称
  • 如果 Razor 的 @using 指令声明了 RCL 的命名空间,则可以使用不含 RCL 命名空间的名称添加各个组件。 使用以下方法:
    • 将 @using 指令添加到各个组件
    • 将 @using 指令添加到 _Imports.razor 文件
      • 在顶级 _Imports.razor 文件中包含 @using 指令,使库的组件可用于整个项目。
      • 将指令添加到任何级别的 _Imports.razor 文件,将命名空间应用于文件夹中的单个组件或一组组件。

使可路由组件可从 RCL 获取

若要使 RCL 中的可路由组件可用于直接请求,必须向应用的路由器公开 RCL 的程序集。打开服务器项目的 Program.cs 文件,并添加以下代码:

  1. app.MapRazorComponents<App>()
  2. .AddInteractiveServerRenderMode()
  3. .AddInteractiveWebAssemblyRenderMode()
  4. .AddAdditionalAssemblies(typeof(MyComponents.Client._Imports).Assembly)
  5. //添加以下代码,引入RCL的程序集
  6. .AddAdditionalAssemblies(typeof(RazorClassLibrary1._Imports).Assembly);

静态资源

RCL 的静态资产可用于任何使用该库的应用,将静态资产放在 RCL 的 wwwroot 文件夹中,并在应用中使用以下路径引用静态资产:

  1. _content/{PACKAGE ID}/{PATH AND FILE NAME}
  1. <img src="_content/RazorClassLibrary1/img/test.png" />
  • {PACKAGE ID} :库的包 ID ,如果没有指定则包 ID 默认为项目的程序集名称
  • {PATH AND FILE NAME} : wwwroot 下的路径和文件名

此路径格式还用于应用中由添加到 RCL 的 NuGet 包提供的静态资产。

表单

组件呈现的是标准的 HTML 元素, 实际上可以使用标准的 HTML 表单元素。但还是建议使用各种 Blazor 输入控件, 因为它们带有额外的功能。关于组件更详细的内容,请参考官方文档ASP.NET Core Blazor表单概述

EditForm

Blazor 中提供了一个可用的输入组件的标准集合,所有组件都派自基类 InputBase<T> :
image

标准输入组件

下面是一个标准输入组件使用示例,都比较简单就不再单独介绍:

  1. @page "/demo"
  2. @rendermode InteractiveAuto
  3. <h3>Demo</h3>
  4. <EditForm Model="FormData">
  5. <label>输入复选框 Boolean:</label>
  6. <InputCheckbox @bind-Value=FormData.Boolean /> <br />
  7. <label>输入日期 DateTime:</label>
  8. <InputDate @bind-Value=FormData.DateTime ParsingErrorMessage="必须是日期" /> <br />
  9. <label>输入数:</label>
  10. <label>输入整数 Integer:</label><br />
  11. <InputNumber @bind-Value=FormData.Integer ParsingErrorMessage="必须是整数值" /> <br />
  12. <label>输入十进制 Decimal:</label> <br />
  13. <InputNumber @bind-Value=FormData.Decimal ParsingErrorMessage="必须是十进制值" /> <br />
  14. <label>输入选择 Select:</label>
  15. <InputSelect @bind-Value=FormData.Select>
  16. @foreach (var item in Enum.GetValues(typeof(State)))
  17. {
  18. <option value=@item>@item.ToString()</option>
  19. }
  20. </InputSelect><br />
  21. <label>输入单选 Radio:</label> <br />
  22. <InputRadioGroup @bind-Value=FormData.Radio>
  23. @foreach (var item in Enum.GetValues(typeof(State)))
  24. {
  25. <InputRadio Value=@item />
  26. @item.ToString()
  27. <br />
  28. }
  29. </InputRadioGroup>
  30. <label>输入文本 String:</label> <br />
  31. <InputText @bind-Value=FormData.String /> <br />
  32. <label>输入多行文本 String:</label> <br />
  33. <InputTextArea @bind-Value=FormData.MultiLineStr /> <br />
  34. </EditForm>
  1. @code
  2. {
  3. //指示应从表单数据中提供关联属性的值
  4. [SupplyParameterFromForm]
  5. private TestModel FormData { get; set; } = new TestModel();
  6. class TestModel
  7. {
  8. public bool Boolean { get; set; }
  9. public DateTime? DateTime { get; set; }
  10. public int Integer { get; set; }
  11. public decimal Decimal { get; set; }
  12. public string String { get; set; }
  13. public string MultiLineStr { get; set; }
  14. public State Select { get; set; } = State.Active;
  15. public State Radio { get; set; }= State.Active;
  16. }
  17. public enum State
  18. {
  19. Pending,
  20. Active,
  21. Suspended
  22. }
  23. }

运行效果如下:
image

验证

表单验证需要注意两点:

  • 必须在EditForm内添加一个验证组件 DataAnnotationsValidatorEditForm
  • 可以通过两种方式向用户显示验证错误消息,两者互不冲突可以同时使用:
    • ValidationSummary:显示表单中所有错误的完整列表
    • ValidationMessage:显示特定输入的错误消息
      下面是一个简单的示例,注意要使用OnValidSubmit事件,否则验证不会生效:
  1. @page "/demo"
  2. @rendermode InteractiveAuto
  3. @using System.ComponentModel.DataAnnotations
  4. <h3>Demo</h3>
  5. <EditForm Model=@Person FormName="personForm" OnValidSubmit=@SubmitForm>
  6. @* 必须指定一个验证机制 *@
  7. <DataAnnotationsValidator />
  8. @* 显示表单中所有错误的完整列表 *@
  9. <ValidationSummary />
  10. <div class="form-group">
  11. <label for="Name">Name</label>
  12. <InputText @bind-Value=Person.Name/>
  13. @* 显示单个字段的错误消息 *@
  14. <ValidationMessage For="() => Person.Name" />
  15. </div>
  16. <div class="form-group">
  17. <label for="Age">Age</label>
  18. <InputNumber @bind-Value=Person.Age/>
  19. @* 引用"" 和 Razor 表达式@(...) 两种形式都是等效的
  20. 1.引用的表格更易于阅读,
  21. 2.Razor 表达式可以清楚地知道定义的是表达式而不是字符串 *@
  22. <ValidationMessage For=@(() => Person.Age) />
  23. </div>
  24. <input type="submit" class="btn btn-primary" value="保存" />
  25. </EditForm>
  1. @code {
  2. //验证需要引入命名空间 System.ComponentModel.DataAnnotations
  3. public class PersonModel
  4. {
  5. //指定属性不能为 null 或为空
  6. [Required(ErrorMessage = "姓名不能为空。")]
  7. public string Name { get; set; }
  8. //指定属性的有效值范围(从 18 到 80),还提供适合向用户显示的错误消息
  9. [Range(18, 80, ErrorMessage = "年龄必须在18岁到80岁之间。")]
  10. public int Age { get; set; }
  11. }
  12. [SupplyParameterFromForm]
  13. private PersonModel Person { get; set; } = new PersonModel();
  14. }

运行效果如下:
image

HTML 表单

使用常规 HTML <form> 标签创建表单,并指定用于处理提交的表单请求的 @onsubmit 处理程序:

  1. @* 必须提供表名 *@
  2. <form @formname="htmlForm" @onsubmit="SubmitForm">
  3. @* 为了安全起见,必须提供 AntiforgeryToken *@
  4. <AntiforgeryToken />
  5. <div class="form-group">
  6. <label for="Name">Name</label>
  7. <InputText @bind-Value=Person.Name class="form-control" />
  8. </div>
  9. <div class="form-group">
  10. <label for="Age">Age</label>
  11. <InputNumber @bind-Value=Person.Age class="form-control" />
  12. </div>
  13. <input type="submit" class="btn btn-primary" value="保存" />
  14. </form>

在表单中包含 AntiforgeryToken 组件以包含防伪支持,详细内容可参考官方文档 防伪支持

对于基于 EditForm 的窗体,默认情况下会自动添加 AntiforgeryToken 组件和 [RequireAntiforgeryToken] 属性以提供防伪保护。

原文链接:https://www.cnblogs.com/timefiles/p/18367761

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号