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

ASP.NET Razor搜索后分支下拉框值重置原因及保留方案问询

问题描述

ASP.NET Razor开发中,选择分支下拉框的值后点击搜索,返回搜索结果时下拉框会被重置,无法保留之前选中的分支值,期望搜索后仍保持选中状态。

相关代码如下:

前端代码

<form id="FrmShelfLabelPrintrSetup" method="post" onsubmit="return validateForm() ">
    <div class="row">
        <div class="col-lg-12 col-12 row">
            <div class="col-md-3 col-lg-2">
                <label for="branch-selectlbl" style="margin-left:3px;font-size:15px;font-family: 'Open Sans', sans-serif;font-weight: bold;">Print Server</label>
                <select id="branch-select" asp-for="SelectedBranchId" name="selectbranchid" class="form-select" style="margin-left:3px;font-size:15px;font-family: 'Open Sans' , sans-serif;font-weight: bold;" onchange="toggleButtonVisibility()">
                    <option value="0">--Select--</option>
                    @foreach (var branches in Model.branches)
                    {
                        <option value="@branches.iBranchCode">@branches.vBranchDesc</option>
                    }
                </select>
            </div>
            <div class="col-md-3 col-lg-2">
                <br>
                <button id="Searchtxt" type="submit" name="searchButton" value="search" asp-page-handler="Search" style="width:100px;margin-top:7px;" class="btn btn-primary">Search</button>
            </div>
        </div>
    </div>
</form>

后端代码

public async Task<IActionResult> OnPostSearchAsync(string selectbranchid)
{
    DataTable dtresults =  _IAdcSupportService.ExecuteQuery(_IAdcSupportService.GetAllPrinters("Branch", selectbranchid));
    if(dtresults.Rows.Count>0)
    {
        ViewData["SearchResults"] = dtresults;
    }
    
    DataTable dtbranches = _IAdcSupportService.GetBranchDetails();
    branches = dtbranches.AsEnumerable()
        .Select(row => new UC.ADC.Core.Entities.SQL.Branch
        {
            iBranchCode = (string)row["iBranchCode"],
            vBranchDesc = row["vBranchDesc"].ToString()
        })
        .ToList();
            
    return Page();
}
原因分析

下拉框重置的核心原因是页面回发后,Model的SelectedBranchId属性未被赋值。Razor的asp-for="SelectedBranchId"会根据该属性的值自动选中对应的下拉选项,但当前OnPostSearchAsync方法仅接收了selectbranchid参数,却没有把这个值赋值给SelectedBranchId,导致页面重新渲染时SelectedBranchId为空,下拉框默认选中value="0"的选项。

解决方案

1. 后端赋值选中的分支ID

在OnPostSearchAsync方法中,将接收的selectbranchid赋值给Model的SelectedBranchId属性:

public async Task<IActionResult> OnPostSearchAsync(string selectbranchid)
{
    // 保存选中的分支ID到Model属性
    SelectedBranchId = selectbranchid;

    DataTable dtresults =  _IAdcSupportService.ExecuteQuery(_IAdcSupportService.GetAllPrinters("Branch", selectbranchid));
    if(dtresults.Rows.Count>0)
    {
        ViewData["SearchResults"] = dtresults;
    }
    
    DataTable dtbranches = _IAdcSupportService.GetBranchDetails();
    branches = dtbranches.AsEnumerable()
        .Select(row => new UC.ADC.Core.Entities.SQL.Branch
        {
            iBranchCode = (string)row["iBranchCode"],
            vBranchDesc = row["vBranchDesc"].ToString()
        })
        .ToList();
            
    return Page();
}

2. 优化下拉框渲染(可选)

可以使用Razor的asp-items标签助手替代手动foreach,让绑定更简洁可靠:

<select id="branch-select" asp-for="SelectedBranchId" asp-items="@(new SelectList(Model.branches, "iBranchCode", "vBranchDesc"))" 
        name="selectbranchid" class="form-select" style="margin-left:3px;font-size:15px;font-family: 'Open Sans' , sans-serif;font-weight: bold;" 
        onchange="toggleButtonVisibility()">
    <option value="0">--Select--</option>
</select>

SelectList会自动根据SelectedBranchId的值匹配选项并设置选中状态,无需手动判断。

补充说明

确保SelectedBranchId的类型和分支的iBranchCode类型一致(当前代码中都是string,没问题),如果类型不匹配会导致绑定失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:53:16