You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:32