ASP.NET Web Pages 2添加验证遇上下文名称不存在错误,求修改方案
解决Razor页面中“The name does not exist in the current context”错误及添加验证功能
首先,你的代码里有两个关键问题导致了这个错误:一是多余的嵌套大括号破坏了Razor的语法结构,二是直接使用Request.Form的方式在Razor Pages中不够规范,容易引发上下文识别问题。结合你用的VS2017和ASP.NET Web Pages(实际你的代码是Razor Pages,属于ASP.NET Core),我给你两种解决方案,优先推荐更优雅的模型绑定方式:
方案一:使用模型绑定+数据注解验证(推荐)
这是ASP.NET Core中官方推荐的表单处理和验证方式,既能解决上下文错误,又能轻松实现验证逻辑。
1. 修改后台模型类(Create.cshtml.cs)
打开Proj_s/Pages/Projects/Create.cshtml.cs,更新为以下代码:
using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace Proj_s.Pages.Projects { public class CreateModel : PageModel { // 用BindProperty标记要绑定的输入模型 [BindProperty] public ProjectInput Input { get; set; } public void OnGet() { ViewData["Title"] = "Create"; } // 处理POST请求 public IActionResult OnPost() { // 检查验证是否通过 if (!ModelState.IsValid) { return Page(); // 验证失败返回当前页面显示错误 } // 这里写你的业务逻辑,比如保存到数据库 // 示例:_context.Projects.Add(new Project { CompanyName = Input.CompanyName, ... }); // _context.SaveChanges(); return RedirectToPage("./Index"); // 成功后跳转到列表页 } // 定义输入模型,添加验证注解 public class ProjectInput { [Required(ErrorMessage = "请填写公司名称")] public string CompanyName { get; set; } [Required(ErrorMessage = "请填写联系人姓名")] public string ContactName { get; set; } [Range(1, int.MaxValue, ErrorMessage = "员工数量必须大于0")] public int EmployeeCount { get; set; } } } }
2. 修改前端页面(Create.cshtml)
替换原来的页面代码为:
@page @model Proj_s.Pages.Projects.CreateModel @{ ViewData["Title"] = "Create"; } <h1>创建项目</h1> <form method="post"> <div class="form-group mb-3"> <label asp-for="Input.CompanyName" class="form-label"></label> <input asp-for="Input.CompanyName" class="form-control" /> <!-- 自动显示验证错误 --> <span asp-validation-for="Input.CompanyName" class="text-danger"></span> </div> <div class="form-group mb-3"> <label asp-for="Input.ContactName" class="form-label"></label> <input asp-for="Input.ContactName" class="form-control" /> <span asp-validation-for="Input.ContactName" class="text-danger"></span> </div> <div class="form-group mb-3"> <label asp-for="Input.EmployeeCount" class="form-label"></label> <input asp-for="Input.EmployeeCount" class="form-control" /> <span asp-validation-for="Input.EmployeeCount" class="text-danger"></span> </div> <button type="submit" class="btn btn-primary">创建</button> </form>
方案二:修复原有代码结构(手动处理表单)
如果你坚持用Request.Form的方式,首先要修正语法错误,再添加手动验证:
@page @model Proj_s.Pages.Projects.CreateModel @{ ViewData["Title"] = "Create"; // 提前声明变量,确保上下文可访问 string companyname = string.Empty; string contactname = string.Empty; int employeecount = 0; if (IsPost) { companyname = Request.Form["companyname"]; contactname = Request.Form["contactname"]; // 安全解析整数,避免转换错误 int.TryParse(Request.Form["employees"], out employeecount); // 手动添加验证逻辑 if (string.IsNullOrWhiteSpace(companyname)) { ModelState.AddModelError("companyname", "公司名称不能为空"); } if (string.IsNullOrWhiteSpace(contactname)) { ModelState.AddModelError("contactname", "联系人姓名不能为空"); } if (employeecount <= 0) { ModelState.AddModelError("employees", "员工数量必须大于0"); } } } <form method="post"> <div class="form-group mb-3"> <label>公司名称</label> <input type="text" name="companyname" value="@companyname" class="form-control" /> @if (ModelState.ContainsKey("companyname") && !ModelState.IsValid) { <span class="text-danger">@ModelState["companyname"].Errors[0].ErrorMessage</span> } </div> <div class="form-group mb-3"> <label>联系人姓名</label> <input type="text" name="contactname" value="@contactname" class="form-control" /> @if (ModelState.ContainsKey("contactname") && !ModelState.IsValid) { <span class="text-danger">@ModelState["contactname"].Errors[0].ErrorMessage</span> } </div> <div class="form-group mb-3"> <label>员工数量</label> <input type="number" name="employees" value="@employeecount" class="form-control" /> @if (ModelState.ContainsKey("employees") && !ModelState.IsValid) { <span class="text-danger">@ModelState["employees"].Errors[0].ErrorMessage</span> } </div> <button type="submit" class="btn btn-primary">创建</button> </form>
为什么方案一更好?
- 模型绑定自动处理表单数据的读取和类型转换,避免手动解析的麻烦和错误
- 数据注解验证集中管理规则,代码更简洁易维护
- 标签助手(
asp-for、asp-validation-for)自动生成表单元素和错误信息,减少重复代码
内容的提问来源于stack exchange,提问作者streamc
相关产品推荐
相关产品推荐

