为何ASP.NET Core Razor页面仅向控制器传递Email、Password两个会员字段?
两种实现方案的具体落地方式
方案一:页面额外提交isDesigner布尔字段
这种方式不需要改动后端数据库查询逻辑,只需要在Razor表单内新增隐藏域,随表单一起提交字段值:
- 确保你的
Member实体类已经定义了isDesigner这个布尔类型属性 - 在cshtml的
<form>标签内部、提交按钮上方新增一行隐藏域代码:
<input asp-for="isDesigner" type="hidden" />
表单提交时,这个字段会自动通过模型绑定传入后端的Index(Member member)方法的入参里,可直接通过member.isDesigner读取值。
注意:所有前端页面提交的字段都可以被恶意篡改;且登录页初始加载时,并没有拿到对应用户的真实
isDesigner值,隐藏域传的只是模型默认值,无法匹配不同用户的真实身份标识,开发成本和风险都远高于直接从数据库查询的方式,不推荐在权限相关的场景使用。
方案二:控制器根据提交的Email从数据库查询isDesigner(推荐)
这种方式的字段值完全来自数据库权威数据源,不存在前端篡改的风险,也不需要改动前端cshtml的代码结构,只需要调整控制器内的登录校验逻辑即可:
原来的登录逻辑用Where().Any()只能判断有没有匹配的账号,拿不到具体的用户实体信息,改成先查出匹配的用户实体,即可直接获取isDesigner字段值:
[HttpPost] public ActionResult Index(Member member) { // 根据提交的Email查询数据库中对应的用户实体 var validUser = _context.Members.FirstOrDefault(x => x.Email == member.Email); // 校验用户存在性和密码正确性 if (validUser != null && validUser.Password == member.Password) { // 此处可直接读取validUser.isDesigner的值,完成后续业务逻辑 // 例如根据isDesigner值做权限跳转、身份赋值等操作 return Redirect("/Product"); } else { TempData["Message"] = "Invalid user"; return View(); } }
这种方式的额外优势是:一次数据库查询即可拿到用户的全量关联字段,不需要为了取isDesigner单独再查一次数据库,性能更优,也更符合权限校验的安全规范。
内容的提问来源于stack exchange,提问作者student guy
相关产品推荐
相关产品推荐

