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

ASP.NET Core MVC:验证后如何保留下拉框选中选项?

解决验证失败后下拉框选中状态丢失的问题

核心问题分析

你当前依赖ViewBag.User(用户名文本)标记选中项,存在两个隐患:

  1. 用户名可能重复,导致匹配错误
  2. 验证失败返回视图时,若未重新给ViewBag.User赋值,就会丢失选中状态

正确的做法是优先从ModelState获取用户提交的表单值——验证失败时,ModelState会自动保留用户之前提交的所有表单数据,无需额外传递。

代码修改方案

1. 重构选中值的获取逻辑

在视图的users列表生成后,添加以下代码获取选中的用户ID:

@{
    var selectedUserId = string.Empty;
    // 优先从ModelState取提交的值(验证失败时会保留)
    if (ModelState.ContainsKey("ID") && ModelState["ID"].Value != null)
    {
        selectedUserId = ModelState["ID"].Value.AttemptedValue;
    }
    // 首次加载或需要从后端传递选中值时,用ViewBag(可选)
    else if (ViewBag.SelectedUserId != null)
    {
        selectedUserId = ViewBag.SelectedUserId.ToString();
    }

    bool hasSelected = !string.IsNullOrEmpty(selectedUserId);

    string onchangeString = ViewBag.UpdateTable == 1 ? "onchange = updateTableSelection();" : "";
}

2. 修改下拉框选项的选中判断

将原来通过用户名文本匹配的逻辑,改为通过用户ID(Value属性)匹配,避免用户名重复的问题:

<select class="form-control" id="ID" name="ID" @onchangeString>
    @if (!hasSelected)
    {
        <option value="" disabled selected>--Select a user--</option>
    }

    @foreach (var u in users)
    {
        <option value="@u.Value" @(u.Value == selectedUserId ? "selected" : "")>@u.Text</option>
    }
</select>

控制器端注意事项

提交表单的Action中,验证失败返回视图时无需额外传递ViewBag,ModelState会自动保留用户提交的ID值:

[HttpPost]
public IActionResult GrantAccess(string ID, string AppId)
{
    // 验证逻辑:检查用户是否已拥有该应用权限
    if (UserHasAccess(ID, AppId))
    {
        ModelState.AddModelError("", "该用户已拥有此应用权限");
        // 直接返回视图,ModelState会保留提交的ID和AppId
        var users = _userService.GetAllUsers();
        return View(users);
    }

    // 授权逻辑...
    return RedirectToAction("Index");
}

方案有效性说明

  • ModelState是ASP.NET Core中专门用于保存表单提交状态和验证信息的容器,验证失败时不会丢失用户输入
  • 用用户ID(唯一标识)匹配选中项,避免了用户名重复导致的错误匹配
  • 逻辑更简洁,无需手动维护ViewBag的状态传递

内容的提问来源于stack exchange,提问作者NickCantCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:12:46