- 动态数据表格:分页、排序、过滤一网打尽
- 响应式表单验证:自定义校验规则+实时反馈
- 复杂图表:动态数据绑定+交互式可视化
- 主题定制:从颜色到布局的全栈控制
- 状态管理:与Blazor State Container无缝集成
二、核心功能深度解析
1. 动态数据表格(MudDataGrid)
@page "/dynamic-grid"
@using MudBlazor
@using System.Linq
<MudDataGrid T="Employee" Items="@Employees"
Hover="true"
Dense="true"
MultiSelection="true"
SelectionMode="DataGridSelectionMode.Multiple">
<Columns>
<PropertyColumn Property="@(x => x.Id)" />
<PropertyColumn Property="@(x => x.Name)" />
<PropertyColumn Property="@(x => x.Department)" />
<PropertyColumn Property="@(x => x.Salary)">
<EditTemplate>
<MudTextField @bind-Value="context.Item.Salary"
Type="MudTextFieldType.Number"
Variant="Variant.Outlined" />
</EditTemplate>
</PropertyColumn>
</Columns>
</MudDataGrid>
@code {
private List<Employee> Employees = new()
{
new Employee { Id = 1, Name = "Alice", Department = "HR", Salary = 50000 },
new Employee { Id = 2, Name = "Bob", Department = "IT", Salary = 75000 }
};
// 自定义分页逻辑
private void OnPageChange(DataGridPageEventArgs<Employee> args)
{
// 实现服务端分页
}
// 自定义排序
private void OnSort(SortEventArgs<Employee> args)
{
Employees = Employees.OrderBy(args).ToList();
}
}
代码注释:
PropertyColumn
:自动绑定属性,支持类型推断EditTemplate
:内联编辑支持,通过MudTextField
实现数字输入SelectionMode
:支持单选/多选模式OnPageChange
/OnSort
:实现服务端分页和排序的钩子函数
2. 响应式表单验证(MudForm)
<MudForm @ref="form" ValidateOnSubmit="true">
<MudTextField T="string"
Label="Email"
@bind-Value="model.Email"
Variant="Variant.Filled"
Required="true"
Validation="@(() =>
new ValidationMessage("Invalid email format",
!Regex.IsMatch(model.Email, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\z", RegexOptions.IgnoreCase)))" />
<MudTextField T="DateTime"
Label="Birthday"
@bind-Value="model.Birthday"
Variant="Variant.Outlined"
Required="true"
HelperText="格式:YYYY-MM-DD" />
<MudButton Color="Color.Primary" OnClick="SubmitForm">提交</MudButton>
</MudForm>
@code {
private MudForm form;
private EmployeeModel model = new();
private async Task SubmitForm()
{
if (await form.Validate())
{
// 提交逻辑
}
}
}
代码注释:
Validation
:内联定义验证规则,支持正则表达式HelperText
:字段下方的帮助提示ValidateOnSubmit
:自动触发验证,避免无效提交MudForm
:集中管理表单状态,支持级联验证
3. 交互式图表(MudChart)
<MudPaper Class="pa-4">
<MudChart
ChartType="ChartType.Line"
ChartSeries="@Series"
XAxisLabels="@Labels"
Width="100%"
Height="400px"
@bind-SelectedIndex="SelectedIndex">
<ChartOptions>
<LineOptions
LineWidth="2"
Dashed="false"
DataLabels="true" />
</ChartOptions>
</MudChart>
</MudPaper>
@code {
private List<ChartSeries> Series = new()
{
new ChartSeries
{
Name = "Sales",
Data = new double[] { 12, 19, 3, 5, 2, 3 },
Color = "#2196F3"
}
};
private string[] Labels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun" };
private int SelectedIndex = -1;
// 动态更新数据
private async void UpdateData()
{
Series[0].Data = await GetLatestSalesData();
StateHasChanged();
}
}
代码注释:
ChartType
:支持Line/Bar/Pie等类型ChartOptions
:自定义线条宽度、虚线、数据标签@bind-SelectedIndex
:实现数据点交互选中StateHasChanged
:强制UI更新,适用于异步数据加载
4. 主题定制与暗黑模式
// 在Program.cs中注册主题服务
builder.Services.AddMudServices(config =>
{
config.Theme = new MudTheme
{
Palette = new Palette
{
Primary = "#2196F3",
Secondary = "#4CAF50",
Background = "#F5F5F5",
TextPrimary = "#333333"
},
Rounded = true,
Dark = false // 开启暗黑模式
};
});
<!-- 在MainLayout.razor中切换主题 -->
<MudButton Color="Color.Primary" OnClick="ToggleTheme">切换主题</MudButton>
@code {
private void ToggleTheme()
{
var theme = _themeService.GetTheme();
theme.Dark = !theme.Dark;
_themeService.SetTheme(theme);
}
}
代码注释:
Palette
:自定义主色、背景色等Rounded
:启用组件圆角设计ToggleTheme
:通过服务动态切换主题
5. 状态管理与组件通信
// 使用Blazor State Container
public class AppState : StateProvider
{
public List<Order> Orders { get; set; } = new();
}
// 在组件中消费状态
@inject AppState AppState
<MudDataGrid Items="@AppState.Orders" ... />
// 在服务端更新状态
public class OrderService
{
public async Task AddOrder(Order order)
{
await AppState.SetStateAsync(state => state.Orders.Add(order));
}
}
三、企业级实战案例:员工管理系统
1. 架构设计
2. 完整代码示例
// 文件路径:EmployeeEditDialog.razor
<MudDialog>
<DialogContent>
<MudForm @ref="form">
<MudTextField @bind-Value="model.Name" Label="姓名" Required="true" />
<MudAutocomplete @bind-Value="model.Department"
Label="部门"
Items="@Departments"
Variant="Variant.Outlined" />
<MudButton Color="Color.Primary" OnClick="Save">保存</MudButton>
</MudForm>
</DialogContent>
</MudDialog>
@code {
[CascadingParameter] private MudDialogInstance MudDialog { get; set; }
private MudForm form;
private EmployeeModel model = new();
private List<string> Departments = new() { "HR", "IT", "Finance" };
private async Task Save()
{
if (await form.Validate())
{
await EmployeeService.Update(model);
MudDialog.Close();
}
}
}
// 文件路径:EmployeeService.cs
public class EmployeeService
{
private readonly HttpClient _httpClient;
public async Task<List<Employee>> GetEmployees()
{
return await _httpClient.GetFromJsonAsync<List<Employee>>("api/employees");
}
public async Task Update(Employee model)
{
await _httpClient.PutAsJsonAsync("api/employees", model);
}
}
四、性能调优与最佳实践
1. 组件虚拟化(Virtualize)
<MudVirtualize Items="@Employees">
<ItemTemplate>
<MudListItem>
<MudText Typo="Typo.body1">@context.Name</MudText>
<MudText Typo="Typo.body2">@context.Department</MudText>
</MudListItem>
</ItemTemplate>
</MudVirtualize>
优势:
- 仅渲染可见区域,适合百万级数据
- 内存占用降低80%
2. 服务端数据绑定
// 在组件中实现分页
private async Task LoadData(int page)
{
var response = await _api.Get($"employees?page={page}");
Employees = response.Data;
TotalCount = response.Total;
}
3. 国际化支持
// 在Program.cs中配置多语言
builder.Services.AddMudServices(config =>
{
config.Language = CultureHelper.GetCurrentCulture();
});
// 在Razor组件中使用
<MudText>@Localizer["WelcomeMessage"]</MudText>
五、完整代码结构与部署
MudBlazorEnterpriseApp/
├── Components/
│ ├── EmployeeList.razor
│ ├── DepartmentForm.razor
│ └── Dashboard.razor
├── Services/
│ ├── EmployeeService.cs
│ └── AppState.cs
├── Shared/
│ ├── Models/
│ │ └── Employee.cs
│ └── Resources/
│ └── Localization.resx
├── Pages/
│ ├── Index.razor
│ └── Login.razor
├── wwwroot/
│ └── themes/
│ └── custom-theme.css
└── Program.cs
六、MudBlazor的终极价值
- 零学习成本:Material Design规范+Blazor的C#语法
- 企业级健壮性:支持复杂表单、数据表格、图表等核心场景
- 性能优势:C#编译优化比JavaScript框架快3-5倍
- 生态完善:与Blazor State Container、Blazorise等无缝集成
- 开源社区:GitHub 10k+ Stars,持续更新(截至2025年4月)