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

ASP.NET Core Razor Pages:表单提交后下拉框选中状态丢失问题

问题:ASP.NET Core Razor Page下拉框提交后选中状态丢失

我在ASP.NET Core Razor Page中实现了一个填充用户名的下拉列表,通过JavaScript的onchange="this.form.submit()"实现选中后自动提交表单。但提交后下拉框的选中状态被清除,不符合预期。

相关代码如下:

Razor页面(.cshtml)代码

<div class="rollname">
     <label class="required">User Name :</label>
     <select id="selectedUser" name="selectedUser" class="form-control-1"
             asp-items='@(new SelectList(Model.Users, "Key", "Value",ViewData["SelectedUserId"]))'
             onchange="this.form.submit()">
         <option value="">--Select--</option>
     </select>

 </div>

后台.cshtml.cs代码

public class PageNameModel : PageModel
{
    public Dictionary<long, string> Users { get; set; } // Replace with actual data type
    
    public void OnGet()
    {
        // Load users data and set default selected user ID
        ViewData["SelectedUserId"] = "123"; // Replace with your logic to get default selected user ID
    }

    public IActionResult OnPost(long selectedUser)
    {
        // Process form submission
        HttpContext.Session.SetString("selectedUserId", selectedUser.ToString());
        ViewData["SelectedUserId"] = selectedUser.ToString();
        return RedirectToPage();
    }
}

解决方案

一、修复当前问题:保留选中状态

问题核心是RedirectToPage()会触发OnGet方法,而你在OnGet里硬编码了默认选中ID,覆盖了Session中存储的已选值。修改OnGet逻辑,优先从Session读取选中ID即可:

修改后台OnGet方法

public void OnGet()
{
    // 加载用户数据逻辑保留
    // 优先从Session取已选ID,无值则用默认值
    var selectedId = HttpContext.Session.GetString("selectedUserId") ?? "123";
    // 注意类型匹配:Users的Key是long,所以转成对应类型
    ViewData["SelectedUserId"] = long.Parse(selectedId);
}

同时调整OnPost里的ViewData赋值,直接用long类型避免类型不匹配:

public IActionResult OnPost(long selectedUser)
{
    HttpContext.Session.SetString("selectedUserId", selectedUser.ToString());
    ViewData["SelectedUserId"] = selectedUser; // 直接传入long类型
    return RedirectToPage();
}

二、更优实现方案:避免整页刷新

用表单提交会导致整页刷新,体验不佳。推荐改用AJAX异步提交,既保留选中状态,又提升用户体验:

1. 修改Razor页面代码

<div class="rollname">
    <label class="required">User Name :</label>
    <select id="selectedUser" name="selectedUser" class="form-control-1"
            asp-items='@(new SelectList(Model.Users, "Key", "Value", ViewData["SelectedUserId"]))'>
        <option value="">--Select--</option>
    </select>
</div>

<!-- 示例:需要更新的用户内容区域 -->
<div id="userContent">
    <!-- 这里展示选中用户的相关数据 -->
</div>

<script>
document.getElementById('selectedUser').addEventListener('change', function() {
    const selectedUserId = this.value;
    if (!selectedUserId) return;

    fetch('/PageName?handler=SelectUser', {
        method: 'POST',
        headers: {
            'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(selectedUserId)
    })
    .then(response => response.text())
    .then(data => {
        // 更新页面需要展示的用户内容
        document.getElementById('userContent').innerHTML = data;
        // 下拉框选中状态自动保留,无需额外处理
    });
});
</script>

2. 后台添加AJAX处理Handler

public IActionResult OnPostSelectUser([FromBody] long selectedUser)
{
    HttpContext.Session.SetString("selectedUserId", selectedUser.ToString());
    // 返回需要更新的HTML片段,比如用户名称或详情
    return Content($"<p>当前选中用户:{Users[selectedUser]}</p>");
}

这种方式无需整页刷新,彻底避免选中状态丢失问题,同时提升页面交互流畅度。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:12:44