ASP.NET MVC级联下拉框仅Index页生效 Create视图无法运行问题求助
问题排查及解决方案
- 路径错误(最常见原因)
你当前AJAX用的是相对路径url: "getDistricts",在Index视图下当前路由是/Pessoas/Index,相对路径会被解析为/Pessoas/getDistricts,能正常请求接口。但在Create视图下当前路由是/Pessoas/Create,相对路径会被解析为/Pessoas/Create/getDistricts,接口不存在自然请求失败。
修复方案:将AJAX的url改为绝对路径,或者用Url.Action辅助方法生成正确路由:
url: '@Url.Action("getDistricts", "Pessoas")'
如果你的JS是写在独立的js文件里不能用Razor语法,就硬编码为/Pessoas/getDistricts即可。
- Create的GET方法未给ViewBag赋值
你当前贴的控制器代码只有Index方法给ViewBag.Gabinetes赋值了SelectList,如果Create对应的GET方法没有写相同的赋值逻辑,视图里的@Html.DropDownList("Gabinetes", null...)会因为数据源为空渲染不出来,自然不会触发change事件。
修复方案:在Create的GET方法里补全赋值逻辑:
public ActionResult Create() { ViewBag.Gabinetes = new SelectList(db.Gabinetes, "GabineteId", "Nome"); return View(); }
- JS加载顺序错误
如果你的JQuery库是在布局页末尾引入的,但你把这段JS代码写在了Create视图的顶部,会因为JQuery还未加载完成,$变量未定义导致事件绑定失败。
修复方案:把JS代码放到JQuery引入语句的后面,或者用布局页的Scripts节包裹代码,确保JQuery加载完成后再执行。
- 元素ID被修改
如果你Create视图用的是强类型辅助方法@Html.DropDownListFor(m => m.xxx.Gabinetes...),渲染出来的元素ID会自动加前缀,不是Gabinetes,导致选择器找不到元素,事件绑定失效。
修复方案:打开浏览器F12开发者工具,检查Gabinete下拉的实际ID,把JS里的选择器替换为实际ID,或者给下拉手动指定id属性:
@Html.DropDownListFor(m => m.xxx, (SelectList)ViewBag.Gabinetes, new { id = "Gabinetes", @class = "form-control" })
内容的提问来源于stack exchange,提问作者Geofragas Gil
相关产品推荐
相关产品推荐

