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
相关产品推荐
相关产品推荐

