【发布时间】:2017-10-25 13:22:13
【问题描述】:
一个表单上有两个 DropDownList。
如果用户在第一个 DropDownList 中选择了一个 Region,那么在第二个 DropDownList 中应该只有与该区域相关的城市。
我已经尝试过在 StackOverflow 上找到的解决方案,但是由于我对 jQuery 和 MVC 的初学者知识,我失败了。也许我的模型/控制器和其他模型/控制器之间存在差异,这些 DropDownLists 已经在表单上,应该使用 ajax 动态更改它们。
HTML
<div class="form-group col-sm-4">
@Html.LabelFor(m => m.Company.Region.Name)
@Html.DropDownList("region", Model.Regions, new { @class = "form-control" ,@id = "Region_drop" })
</div>
<div class="form-group col-sm-4">
@Html.LabelFor(m => m.Company.City.Name)
@Html.DropDownList("city", Model.Cities, new { @class = "form-control" ,@id = "City_drop" })
</div>
控制器
[Authorize]
public ActionResult AddCompany()
{
CompanyModel company = new CompanyModel();
SelectList regions = new SelectList(db.Regions, "Id", "Name");
SelectList cities = new SelectList(db.Cities, "Id", "Name");
AddCompanyViewModel acvm = new AddCompanyViewModel
{
Regions = regions,
Cities = cities,
};
return View(acvm);
}
型号
public class RegionModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Регион")]
[Required]
public string Name { get; set; }
public IEnumerable<CompanyModel> Companies { get; set; }
public IEnumerable<CityModel> Cities { get; set; }
}
public class CityModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Город")]
[Required]
public string Name { get; set; }
public int RegionId { get; set; }
public RegionModel Region { get; set; }
public IEnumerable<CompanyModel> Companies { get; set; }
}
更新: 我尝试编写辅助 ActionResult 以从 DB 获取数据
[HttpPost]
public ActionResult getCitiesAction(int provinceId)
{
var cities = db.Cities.Where(a => a.RegionId == provinceId).Select(a => "<option value='" + a.Id + "'>" + a.Name + "'</option>'");
return Content(String.Join("", cities));
}
然后按照其他解决方案之一的建议添加了一些 JS:
$("#Region_drop").change(function () {
$.ajax({
url: "getCitiesAction",
type: "post",
data: {
provinceId: $("#Region_drop").val()
}
}).done(function (response) {
$("#City_drop").html(response);
});
});
在浏览器中运行它并打断点后,它会显示区域 ID,但在调用 ajax 后,函数就死了。
【问题讨论】:
-
请展示您尝试了什么以及它是如何失败的——也许它离正常工作不远,可以轻松修复。目前没有证据表明,除了你的话,你确实试图这样做。
-
@ADyson 更新了问题,感谢您的回复。
标签: c# asp.net ajax asp.net-mvc