C# MVC编辑表单无法获取nativeLanguage等数据库字段值问题
问题修复:新增字段无法从数据库自动填充的解决方法
针对你在C# MVC项目Edit表单中新增nativeLanguage、secondLanguage、counties字段后无法自动填充的问题,以下是代码中的关键错误及修复方案:
1. Repository查询语句的字段映射错误
Dapper依赖列名与Model属性名的匹配完成赋值,你的SQL查询存在两处不匹配:
- 多语言字段:查询的
native_spoken_language.language_name、second_spoken_language.language_name未指定别名,无法对应Model的nativeLanguage、secondLanguage属性 - 地区字段:查询的
counties.Districts是字符串类型的地区名称,但Model的FK_id_counties是int类型的ID,类型不匹配导致赋值失败
修复后的Repository SQL语句:
string sql = @"SELECT candidate.FK_id_cat_role_skill, candidate.status_candidate, candidate.id_candidate, candidate.code, candidate.candidate_name, candidate.number, native_spoken_language.language_name AS nativeLanguage, -- 增加别名匹配Model属性 second_spoken_language.language_name AS secondLanguage, -- 增加别名匹配Model属性 counties.id_Counties AS FK_id_counties, -- 改为查询ID,匹配Model的int类型属性 candidate.availibility, marital_status.status_name, marital_status.marital_acronym, source.source, cat_role_skill.cat_role_skill_name, countries.country, candidate.birthday_day, candidate.birthday_month, candidate.birthday_year, cities.locality_name, C1.name_candidate_interest_options, candidate.profile, C2.name_candidate_interest_options AS name_candidate_interest_options2, candidate.desc_processes, candidate.candidade_notes FROM (((((((((((candidate LEFT JOIN candidate_interest_options C1 ON candidate.FK_id_candidate_interest_options = C1.id_candidate_interest_options) LEFT JOIN marital_status ON candidate.FK_id_marital_status = marital_status.id_status) LEFT JOIN source ON candidate.FK_id_source = source.id_source) LEFT JOIN user ON candidate.FK_id_user = user.id_user) LEFT JOIN cities ON candidate.FK_id_actual_location = cities.id_locality) LEFT JOIN countries ON candidate.FK_candidate_nationality = countries.id_country) LEFT JOIN candidate_interest_options C2 ON candidate.FK_id_candidate_processes = C2.id_candidate_interest_options) LEFT JOIN cat_role_skill ON candidate.FK_id_cat_role_skill = cat_role_skill.id_cat_role_skill) LEFT JOIN counties ON candidate.FK_id_counties = counties.id_Counties) LEFT JOIN native_spoken_language ON candidate.FK_id_native_language = native_spoken_language.id_native_language) LEFT JOIN second_spoken_language ON candidate.FK_id_second_language = second_spoken_language.id_second_language) WHERE id_candidate = @Id";
2. ViewBag大小写不匹配导致JS无法获取值
View中设置的ViewBag.NativeLanguage、ViewBag.SecondLanguage是首字母大写的驼峰格式,但JS代码中使用@ViewBag.nativeLanguage、@ViewBag.secondaryLanguage全小写调用,导致获取到undefined。
修复后的JS变量定义:
let nativeLanguage = JSON.parse(@Html.Raw(Json.Serialize(@ViewBag.NativeLanguage))); let secondaryLanguage = JSON.parse(@Html.Raw(Json.Serialize(@ViewBag.SecondLanguage)));
3. UpdateStatus方法的目标元素ID错误
JS中调用UpdateStatus时,传入的元素ID与View中下拉框的实际ID不匹配:
- 原生语言下拉框ID是
nativeLanguage,但你传入的是FK_id_native_language - 第二语言下拉框ID是
secondLanguage,但你传入的是FK_id_second_language
修复后的window.onload代码:
window.onload = function () { OnChangeCategory(); OnChangeRole(); UpdateStatus("FK_id_marital_status", maritalStatus); UpdateStatus("FK_id_source", Source); UpdateStatus("FK_candidate_nationality", Nationality); UpdateStatus("FK_id_actual_location", Location); UpdateStatus("FK_id_candidate_interest_options", Options); UpdateStatus("FK_id_candidate_processes", Processes); UpdateStatus("nativeLanguage", nativeLanguage); // 改为下拉框实际ID UpdateStatus("secondLanguage", secondaryLanguage); // 改为下拉框实际ID UpdateStatus("FK_id_counties", Counties); OnAvailibilityYearChange(); document.getElementById("avaYear").addEventListener("change", OnAvailibilityYearChange); }
额外检查点
- 确认
UpdateStatus方法逻辑正确:该方法需要根据传入的文本值找到下拉框中对应的选项并设置选中状态 - 调试时可在Controller中打印
candidate对象的三个新增字段值,验证Repository是否正确从数据库获取到数据
内容的提问来源于stack exchange,提问作者Ricardo Silva
相关产品推荐
相关产品推荐

