从游戏逻辑到用户权限:用C# if else玩转Razor Pages动态网站开发

张开发
2026/4/19 17:51:11 15 分钟阅读

分享文章

从游戏逻辑到用户权限:用C# if else玩转Razor Pages动态网站开发
从游戏逻辑到用户权限用C# if else玩转Razor Pages动态网站开发在ASP.NET Core Razor Pages开发中条件逻辑就像游戏中的关卡设计——它决定了用户能看到什么、能做什么。想象一下当玩家积分达到100分时解锁新地图VIP用户可以看到隐藏内容管理员拥有上帝视角...这些场景背后都是if else在默默掌控全局。本文将带您用游戏开发的思维构建一个融合用户权限与积分系统的动态网站。1. 搭建游戏化权限系统的骨架我们先创建一个名为GamePortal的Razor Pages项目这里不是普通的后台管理系统而是一个带着游戏基因的Web应用。在Startup.cs中配置身份认证时已经埋下了第一个条件判断的种子services.AddAuthorization(options { options.AddPolicy(VIPOnly, policy policy.RequireClaim(Membership, VIP)); options.AddPolicy(Level5, policy policy.RequireAssertion(context int.Parse(context.User.FindFirst(Level)?.Value ?? 0) 5)); });这个配置中出现了两种特殊的权限策略VIPOnly检查用户是否拥有VIP会员资格Level5要求用户游戏等级达到5级以上在Pages目录下创建这样的文件结构/Pages /Shared _GameLayout.cshtml /Game Index.cshtml Index.cshtml.cs /Admin Dashboard.cshtml Dashboard.cshtml.cs2. PageModel中的条件战场打开Game/Index.cshtml.cs我们构建游戏主界面的逻辑模型。这里需要处理三种核心判断public class IndexModel : PageModel { [BindProperty] public int CurrentScore { get; set; } public string PlayerLevel { get; private set; } public bool IsDoubleRewardDay { get; private set; } public void OnGet() { var rnd new Random(); IsDoubleRewardDay DateTime.Now.DayOfWeek DayOfWeek.Friday; if (User.Identity.IsAuthenticated) { CurrentScore int.Parse(User.FindFirst(Score)?.Value ?? 0); PlayerLevel CalculateLevel(CurrentScore); if (IsDoubleRewardDay) { ViewData[BonusMessage] 今日双倍积分; } } } private string CalculateLevel(int score) { if (score 500) return 王者; else if (score 300) return 钻石; else if (score 150) return 黄金; else if (score 50) return 白银; else return 青铜; } }这段代码展示了三个层次的判断用户认证状态检查动态积分等级计算特殊日期奖励判断3. Razor视图中的动态渲染在Game/Index.cshtml中我们让界面根据用户状态活起来page model GamePortal.Pages.Game.IndexModel { ViewData[Title] 游戏大厅; } div classplayer-card if (User.Identity.IsAuthenticated) { h3欢迎回来User.Identity.Name!/h3 div classlevel-badge Model.PlayerLevel.ToLower() 当前等级Model.PlayerLevel /div !-- 积分进度条 -- div classprogress-bar { var nextLevel Model.CurrentScore switch { 50 50, 150 150, 300 300, _ 500 }; var percentage (double)Model.CurrentScore / nextLevel * 100; } div classprogress stylewidth: percentage%/div /div if (Model.IsDoubleRewardDay) { div classalert alert-warning ViewData[BonusMessage] /div } } else { div classguest-welcome a asp-page/Account/Login classbtn btn-primary登录获取游戏资格/a p游客模式下只能体验基础功能/p /div } /div !-- VIP专属区域 -- if (User.HasClaim(Membership, VIP)) { div classvip-lounge h4 VIP游戏室/h4 p专属游戏地图已解锁/p button classbtn btn-vip进入隐藏关卡/button /div }这里使用了多种条件渲染技术if块控制整体模块的显示内联条件表达式计算进度百分比HasClaim方法检查特定权限4. 表单提交的条件处理在Admin/Dashboard.cshtml.cs中我们处理管理操作时的条件验证public IActionResult OnPostAdjustPoints() { if (!User.IsInRole(Admin)) { return Forbid(); } if (PointsAdjustment -100 || PointsAdjustment 100) { ModelState.AddModelError(, 单次调整范围应在±100之间); return Page(); } var targetUser _userService.GetUser(TargetUserId); if (targetUser null) { return NotFound(); } var newPoints targetUser.Points PointsAdjustment; if (newPoints 0) { newPoints 0; } _userService.UpdatePoints(TargetUserId, newPoints); TempData[Message] PointsAdjustment 0 ? $成功为{targetUser.UserName}增加{PointsAdjustment}积分 : $已扣除{targetUser.UserName}的{-PointsAdjustment}积分; return RedirectToPage(); }这个处理方法包含了多层防护管理员权限验证输入范围校验用户存在性检查积分下限保护操作结果反馈5. 高级条件模式实战在真实的游戏网站中我们经常需要处理更复杂的条件组合。以下是几种实用模式模式1功能开关配置// 在appsettings.json中配置 FeatureFlags: { NewYearEvent: true, SummerSale: false } // 在视图中使用 inject IConfiguration Config if (Config.GetValuebool(FeatureFlags:NewYearEvent)) { div classevent-banner img src/images/new-year-event.jpg /div }模式2复合权限检查public bool CanAccessSecretZone() { return User.HasClaim(Membership, VIP) DateTime.Now.Hour 20 DateTime.Now.Hour 22; }模式3策略对象替换条件语句// 定义等级策略接口 public interface ILevelStrategy { bool CanUpgrade(int currentScore); string GetReward(); } // 实现具体策略 public class BronzeStrategy : ILevelStrategy { public bool CanUpgrade(int score) score 50; public string GetReward() 新手礼包; } // 在服务中使用 public class LevelService { private readonly IEnumerableILevelStrategy _strategies; public LevelService(IEnumerableILevelStrategy strategies) { _strategies strategies; } public string CheckLevelUp(int score) { var strategy _strategies.FirstOrDefault(s s.CanUpgrade(score)); return strategy?.GetReward(); } }6. 调试与优化技巧当条件逻辑变得复杂时这些技巧能帮您保持代码清晰技巧1条件语句可视化调试// 在开发环境添加调试信息 #if DEBUG var conditionValues new { IsAuthenticated User.Identity.IsAuthenticated, IsVIP User.HasClaim(Membership, VIP), CurrentHour DateTime.Now.Hour, UserLevel PlayerLevel }; Console.WriteLine($Condition Values: {JsonSerializer.Serialize(conditionValues)}); #endif技巧2创建条件扩展方法public static class UserExtensions { public static bool IsPrimeTimeUser(this ClaimsPrincipal user) { var hour DateTime.Now.Hour; return hour 19 hour 23 user.HasClaim(Membership, VIP); } public static bool IsHighLevelPlayer(this ClaimsPrincipal user) { if (!user.Identity.IsAuthenticated) return false; var level int.Parse(user.FindFirst(Level)?.Value ?? 0); return level 5; } } // 使用示例 if (User.IsPrimeTimeUser()) { !-- 显示黄金时段专属内容 -- }技巧3条件性能优化// 使用短路评估优化条件判断 if (user ! null user.Points 100) { // 只有当user非null时才会检查Points } // 将频繁使用的条件结果缓存 var isWeekend DateTime.Now.DayOfWeek DayOfWeek.Saturday || DateTime.Now.DayOfWeek DayOfWeek.Sunday; // 使用switch表达式简化多条件 var discount userLevel switch { VIP 0.3m, Gold 0.2m, Silver 0.1m, _ 0m };7. 安全注意事项在游戏类网站中处理条件逻辑时这些安全要点不容忽视重要所有客户端传递的参数必须经过服务器端验证不可信任任何前端校验安全实践1权限检查防御链[Authorize(Roles Admin)] public class AdminModel : PageModel { public IActionResult OnPostDeleteUser(string userId) { // 再次验证当前用户权限 if (!User.IsInRole(SuperAdmin)) { _logger.LogWarning($非法删除尝试: {User.Identity.Name}); return Forbid(); } // 验证目标用户是否存在 var targetUser _db.Users.Find(userId); if (targetUser null) { return NotFound(); } // 防止自我删除 if (targetUser.Id User.FindFirstValue(ClaimTypes.NameIdentifier)) { ModelState.AddModelError(, 不能删除自己的账户); return Page(); } _db.Users.Remove(targetUser); await _db.SaveChangesAsync(); return RedirectToPage(/Users/Index); } }安全实践2积分变动审计public class PointsService { public async Task AddPoints(string userId, int points, string reason) { if (points 0) throw new ArgumentException(积分必须为正数); var user await _userManager.FindByIdAsync(userId); if (user null) throw new InvalidOperationException(用户不存在); // 记录积分变动 var transaction new PointsTransaction { UserId userId, Amount points, BalanceBefore user.Points, Reason reason, IPAddress _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString() }; user.Points points; await _db.SaveChangesAsync(); } }安全实践3敏感操作二次确认if (showConfirmation) { div classconfirmation-dialog p确定要消耗100积分兑换此物品吗/p button classbtn btn-danger hx-postUrl.Page(Store, ConfirmPurchase) hx-vals{itemId: item.Id} 确认兑换 /button /div } else { button classbtn btn-primary hx-postUrl.Page(Store, InitPurchase) hx-vals{itemId: item.Id} hx-targetclosest .store-item 兑换物品 /button }

更多文章