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

在Razor页面中使用ViewBag时如何显示验证消息?

在Razor页面中使用ViewBag时如何显示验证消息?

嘿,我来帮你搞定这个问题!看你的代码,已经有带数据注解验证的模型,也在控制器里用ViewData传了职位下拉数据,现在要在Razor页面正确显示验证消息,核心是确保模型绑定正确+验证失败时重新传递下拉数据+页面上正确渲染验证控件,一步步来:

1. 先补全控制器的POST处理逻辑(这步超重要!)

你现在只给了GET的Index方法,要显示验证消息,必须在POST方法里处理模型验证,而且验证失败时要重新把职位下拉数据塞回ViewData,不然页面刷新后下拉框会空,同时验证消息也无法正常显示:

[HttpPost]
public async Task<IActionResult> Index(EmployeeInfo model)
{
    // 先检查模型验证是否通过
    if (!ModelState.IsValid)
    {
        // 验证失败!重新加载职位下拉数据,避免页面下拉框为空
        var jobTitles = await _Reassign.GetJobTitle();
        ViewData["Jobs"] = new SelectList(jobTitles, "JobTitleLookupId", "Title");
        // 返回页面,此时ModelState里的错误会被页面捕获并展示
        return View(model);
    }

    // 验证通过,执行你的业务逻辑,比如保存员工信息
    // ...

    return RedirectToAction("Success");
}

2. Razor页面的正确写法

在你的Razor页面里,要做好这几件事:

  • 顶部声明绑定的模型
  • 用验证控件渲染错误消息
  • 正确结合ViewData渲染下拉框
@model EmployeeInfo

<form asp-action="Index" method="post">
    <!-- 显示所有验证错误的汇总 -->
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

    <!-- 姓名字段 -->
    <div class="form-group">
        <label asp-for="FirstName" class="control-label"></label>
        <input asp-for="FirstName" class="form-control" />
        <!-- 显示FirstName字段的单独验证提示 -->
        <span asp-validation-for="FirstName" class="text-danger"></span>
    </div>

    <!-- 职位下拉框,用ViewData传递的数据源 -->
    <div class="form-group">
        <label class="control-label">Job Title</label>
        <!-- 这里用ViewData["Jobs"]或者ViewBag.Jobs都可以,两者是动态包装关系 -->
        <select asp-for="JobTitleLookup.JobTitleLookupId" asp-items="@ViewData["Jobs"]" class="form-control">
            <option value="">请选择职位</option>
        </select>
        <!-- 显示职位字段的验证提示 -->
        <span asp-validation-for="JobTitleLookup.JobTitleLookupId" class="text-danger"></span>
    </div>

    <button type="submit" class="btn btn-primary">提交</button>
</form>

<!-- 可选:引入验证脚本,开启客户端即时验证,不用提交就能看到错误提示 -->
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

3. 几个关键提醒

  • 为什么要在验证失败时重新传ViewData?因为POST是独立的请求,GET请求时的ViewData数据不会保留,重新传递才能保证下拉框正常显示,同时ModelState里的验证错误会自动被页面识别
  • 你的EmployeeInfo模型里JobTitleLookup是导航属性,绑定的时候要指定到它的JobTitleLookupId,这样Required注解的验证才能触发
  • 客户端验证脚本是可选的,但加上后用户体验会好很多,输入错误时不用提交就能看到提示

备注:内容来源于stack exchange,提问作者rimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:23:14