.NET Core 5 Razor Page下拉框无法返回正确选中值问题求助
问题原因及修复方案
你遇到的下拉框取值异常是多个常见的Razor Pages模型绑定问题叠加导致的,按优先级修复即可:
1. 手动设置的name属性覆盖了asp-for自动生成的绑定标识
asp-for属性会自动为表单控件生成符合模型绑定规则的name属性,你手动给下拉框、日期输入框加的自定义name(比如name="accessrulegroup")会覆盖自动生成的name="paramsearch.AccessRuleGroupCode",导致提交时系统找不到和模型对应的字段,自然只能拿到默认值或者null。
修复方案:删掉所有表单控件上自定义的
name、id属性,完全由asp-for自动生成即可。
2. 绑定字段类型不匹配
你的下拉数据源AccessRuleGroupModel里的AccessRuleGroupCode是int类型,但接收参数的SearchParametersModel里把对应字段定义成了string,类型不匹配会触发绑定失败,同理AccessRuleCategoryCode也存在这个问题。
修复方案:修改
SearchParametersModel的字段类型,和数据源保持一致,如需支持未选择的场景可以用可空类型:
public class SearchParametersModel { public DateTime BeginDate { get; set; } public DateTime EndDate { get; set; } // 改成和数据源一致的int可空类型,未选择时自动赋值为null public int? AccessRuleCategoryCode { get; set; } public int? AccessRuleGroupCode { get; set; } public string SortOrder { get; set; } }
同时可以把下拉框默认选项的value改成空字符串,更符合可空类型的绑定逻辑:
<select asp-items="Model.accessgrouplist" class="form-control" asp-for="paramsearch.AccessRuleGroupCode"> <option value="">Select</option> </select>
3. POST返回页面时未重新绑定下拉数据源
你当前的下拉数据绑定逻辑只写在OnGet方法中,当POST请求触发ModelState.IsValid == false返回页面时,不会自动执行OnGet的逻辑,会导致下拉列表为空。
修复方案:把下拉绑定逻辑抽成公共方法,OnGet和POST返回页面前都调用一次:
// 抽离公共下拉绑定方法 public void BindDropdowns() { this.accessgrouplist = new SelectList(PopulateAcessGroups(), "AccessRuleGroupCode", "AccessRuleGroup"); this.accesscategorylist = new SelectList(PopulateAcessCategories(), "AccessRuleCategoryCode", "AccessRuleCategory"); } public void OnGet() { BindDropdowns(); } public IActionResult OnPost() { if (!ModelState.IsValid) { // 返回页面前重新绑定下拉数据 BindDropdowns(); return Page(); } // 此处即可拿到正确的下拉选择值 var selectedGroupCode = paramsearch.AccessRuleGroupCode; var selectedCategoryCode = paramsearch.AccessRuleCategoryCode; return RedirectToPage("/Index"); }
最后确认你未贴出的PopulateAcessCategories方法的返回值里,AccessRuleCategoryCode字段类型和SearchParametersModel里的对应字段保持一致即可。
内容的提问来源于stack exchange,提问作者JamesW

