96SEO 2026-02-19 11:42 3
当用户点击某个信息时#xff0c;跳转到信息详情页#xff0c;然后可以点击编辑按钮导航到编辑页面。

我们首先在ViewModels目录下创建UserDetailViewModel。
当用户点击某个信息时跳转到信息详情页然后可以点击编辑按钮导航到编辑页面。
我们首先在ViewModels目录下创建UserDetailViewModel。
UserDetailViewModel:ObservableObject,IQueryAttributable
Shell.Current.GoToAsync(nameof(UserEditPage),parameters:
ParentRefreshAction(user);}public
ApplyQueryAttributes(IDictionarystring,
(query.TryGetValue(ParentRefreshAction,out
parentRefreshAction)){ParentRefreshAction
Task)parentRefreshAction;}query.Clear();}
xmlnshttp://schemas.microsoft.com/dotnet/2021/mauixmlns:xhttp://schemas.microsoft.com/winfx/2009/xamlxmlns:vmclr-namespace:MauiApp3.ViewModelsTitle用户详情x:ClassMauiApp3.Views.UserDetailPageContentPage.BindingContextvm:UserDetailViewModel//ContentPage.BindingContextContentPage.ToolbarItemsToolbarItem
ShowEditFormCommand}//ContentPage.ToolbarItemsVerticalStackLayoutLabel
FontSizeLarge//VerticalStackLayout
更新UserEditViewModel我们让他直接继承自UserDetailViewModel.
UserEditViewModel:UserDetailViewModel
isNewItem;[RelayCommand]private
(IsNewItem){context.Users.Add(ItemUser);}else{context.Users.Attach(ItemUser);context.Entry(ItemUser).State
Microsoft.EntityFrameworkCore.EntityState.Modified;}context.SaveChangesAsync();await
ParentRefreshAction(ItemUser);await
Shell.Current.GoToAsync(..);}public
ApplyQueryAttributes(IDictionarystring,
(bool)isNew;}base.ApplyQueryAttributes(query);}
{[ObservableProperty]ObservableCollectionUser
refreshing;[RelayCommand]private
ObservableCollectionUser(context.Users);});Refreshing
UserContext();context.Users.Remove(user);context.SaveChanges();Users.Remove(user);}[RelayCommand]private
Shell.Current.GoToAsync(nameof(UserEditPage),parameters:new
object{{ParentRefreshAction,(FuncUser,Task)RefreshAddedAsync},{Item,new
User()},{IsNewItem,true}});}Task
addedUser){Users.Add(addedUser);return
Task.CompletedTask;}[RelayCommand]async
Shell.Current.GoToAsync(nameof(UserDetailPage),parameters:new
object{{ParentRefreshAction,(FuncUser,Task)RefreshEditedAsync},{Item,user},});}async
(editedItemIndex-1){return;}Users[editedItemIndex]
AppShell(){InitializeComponent();Routing.RegisterRoute(nameof(UserEditPage),typeof(UserEditPage));Routing.RegisterRoute(nameof(UserDetailPage),typeof(UserDetailPage));}
在主页添加GestureRecognizers对详情页面的跳转
RowDefinitions40,40ColumnDefinitions*,*Padding10Grid.GestureRecognizersTapGestureRecognizerCommand{Binding
PathBindingContext.ShowDetailFormCommand,Source{RelativeSource
ModeFindAncestor,AncestorType{x:Type
ContentPage}}}CommandParameter{Binding}//Grid.GestureRecognizers
我们要在数据库和视图模型之间提供一个抽象层它能使项目有不同的模块区分更明确的分离开。
在项目中往往需要对多张表进行操作我们创建一个泛型接口来抽象对数据库中CURD。
item){DbSet.Attach(item);Context.Entry(item).State
DbUnitOfWork:IDisposable,IUnitOfWorkUser
Dispose(){Context.Dispose();}public
uniOfWork.Items.GetAllAsync());Refreshing
uniOfWork.Items.DeleteAsync(user);await
uniOfWork.SaveAsync();Users.Remove(user);
unitOfWork.Items.AddAsync(ItemUser);elseawait
unitOfWork.Items.UpdateAsync(ItemUser);await
ParentRefreshAction(ItemUser);await
unitOfWork.Items.GetByIdAsync(ItemUser.Id);await
Shell.Current.GoToAsync(nameof(UserEditPage),parameters:
很多时候我们需要对用户输入的数据进行验证有很多方法和形式我们来看看在数据库层面如何做错误验证处理。
并反馈在页面给用户。
{//用户邮箱唯一modelBuilder.EntityUser().HasIndex(u
u.Email).IsUnique();//用户名不能为空modelBuilder.EntityUser().Property(u
u.Name).IsRequired();//初始化数据modelBuilder.EntityUser().HasData(new
123456789});base.OnModelCreating(modelBuilder);
uniOfWork.Items.DeleteAsync(user);await
Shell.Current.DisplayAlert(Error,
OK);return;}Users.Remove(user);
unitOfWork.Items.AddAsync(ItemUser);elseawait
unitOfWork.Items.UpdateAsync(ItemUser);await
Shell.Current.DisplayAlert(Error,
ParentRefreshAction(ItemUser);await
程序中在将数据提交到数据库之前可以在UI层执行某些验证规则可以在用户保存某些修改时告知用户从而改善用户体验。
在编辑用户页面我们添加对用户名和邮箱的验证并关联到保存命令上。
[NotifyCanExecuteChangedFor(nameof(SaveCommand))]
isEmailValid;[NotifyCanExecuteChangedFor(nameof(SaveCommand))]
IsNameValid;[RelayCommand(CanExecute
unitOfWork.Items.AddAsync(ItemUser);elseawait
unitOfWork.Items.UpdateAsync(ItemUser);await
Shell.Current.DisplayAlert(Error,
ParentRefreshAction(ItemUser);await
在UserEditPage文件中我们添加一个样式来反馈给用户并使用工具包中的ValidationBehavior来进行验证和绑定命令。
这个验证很简单当用户输入的内容不满足条件时会使用我们设置的样式颜色来显示保存按钮无法点击当满足条件时颜色变为正常并可以保存内容。
xmlnshttp://schemas.microsoft.com/dotnet/2021/mauixmlns:xhttp://schemas.microsoft.com/winfx/2009/xamlxmlns:vmclr-namespace:MauiApp3.ViewModels;assemblyMauiApp3xmlns:toolkit
http://schemas.microsoft.com/dotnet/2022/maui/toolkitx:ClassMauiApp3.Views.UserEditPageTitle新用户ContentPage.BindingContextvm:UserEditViewModel//ContentPage.BindingContextContentPage.ResourcesStyle
ValueRed/Setter/Style/ContentPage.ResourcesGridVerticalStackLayout
ItemUser.Name}Entry.Behaviorstoolkit:TextValidationBehavior
invalidEntryStyle}IsValid{Binding
IsNameValid}FlagsValidateOnValueChanged,ValidateOnAttaching//内容长度不能小于5MinimumLength5//Entry.Behaviors/EntryEntry
ItemUser.Email}ReturnCommand{Binding
SaveCommand}Entry.Behaviors//验证是否时正常的邮箱格式toolkit:EmailValidationBehaviorInvalidStyle{StaticResource
invalidEntryStyle}IsValid{Binding
IsEmailValid}FlagsValidateOnValueChanged,ValidateOnAttaching//Entry.Behaviors/EntryButton
SaveCommand}//VerticalStackLayoutActivityIndicator
VerticalOptionsCenterHorizontalOptionsCenterIsRunning{Binding
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback