【问题标题】:Cascading Drop Down List in MVC w/ SQL Database带有 SQL 数据库的 MVC 中的级联下拉列表
【发布时间】:2015-08-05 18:08:56
【问题描述】:

我有两个下拉列表,分别是地区和学校。我希望每当我从列表中选择一个地区时,学校列表中的值都会同时改变。我正在使用 ajax 尝试将数据发布到另一个控制器,但学校列表根本没有改变。无论我选择哪个学区,它都包含所有学校的名称。我认为这与我的SchoolDistrictInformation 控制器中的Schools = new SelectList(db.Schools.ToList(), "schoolID", "name") 行有关。到目前为止,这是我正在使用的内容:

安全码是必须输入的代码,与所选的地区相对应。必须与数据库中的代码匹配,否则表单将无法提交。

查看模型:

public class DistrictSchoolListViewModel
{
    public SelectList Districts { get; set; }
    public SelectList Schools { get; set; }
    public string SelectedSchool { get; set; }
    public string SelectedDistrict { get; set; }
    [Required(ErrorMessage = "This code is required")]
    public string DistrictCode { get; set; }
}

控制器:

public ActionResult SchoolDistrictInformation()
{
    var viewModel = new DistrictSchoolListViewModel()
    {
        Districts = new SelectList(db.Districts.ToList(), "leaID", "name"),
        Schools = new SelectList(db.Schools.ToList(), "schoolID", "name")
    };
    return View(viewModel);
}

[HttpPost]
public ActionResult GetSchools(DistrictSchoolListViewModel model)
{
    var selectedDistrict = model.SelectedDistrict;
    var schools = findSchools(selectedDistrict);
    IEnumerable<SelectListItem> filteredSchools = 
    schools.Select(m => new SelectListItem { Text = m.name, Value = m.schoolID.ToString() });
    return PartialView("SchoolDistrictInformation", filteredSchools);
}

校表查询:

    internal IQueryable<School> findSchools(string district)
    {
        var query = from School in db.Schools
                    where School.leaID.Equals(district)
                    select School;
        return query;
    }

学区信息查看:

@model Staff_Form.Models.DistrictSchoolListViewModel 

<h2>Select District and School from list</h2>

<script type="text/javascript" src="/scripts/jquery-1.4.4.js"></script>
<script type="text/javascript">
$('#SelectedDistrict').on('change', function () {

    $.ajax({
        type: "POST",
        url: 'Controller/GetSchools',
        data: $(this).val(),
        success: function (response) {
            $('#SelectedSchool').html(response);
        }
    });

});

</script>

<div>
    <form action="@Url.Action("StaffInformation", "Staff")" method="get">
        District: @Html.DropDownListFor(m => m.SelectedDistrict, Model.Districts, "----Select----")
        Security Code: @Html.TextBoxFor(m => m.DistrictCode) <br />
        School: @Html.DropDownListFor(m => m.SelectedSchool, Model.Schools, "----Select----")
        <input type="submit" value="Submit" />
    </form>
</div>

获取学校视图:

@model System.Collections.Generic.IEnumerable<System.Web.Mvc.SelectListItem>
@{ Layout = null;}

@foreach (var school in Model)
{
    <option value="@school.Value">@school.Text</option>
}

感谢为解决此问题提供的任何和所有帮助。谢谢!

【问题讨论】:

  • 过滤后的学校 linq 查询是否返回正确的列表?
  • 你需要更好地定义你的data:参数..data: {SelectedDistrict: $(this).val()
  • 从测试和断点的使用来看,我的 ajax 调用似乎存在问题,因为当我从下拉列表中选择一个区域时,它甚至没有进入查询。 @马克

标签: mysql ajax asp.net-mvc cascadingdropdown


【解决方案1】:

您的脚本位于带有 id="SelectedDistrict" 的元素之前,而不是包含在 $(document).ready() 中,因此您将事件附加到当时甚至不存在的元素。

将脚本移动到页面底部(紧接在结束 &lt;/body? 标记之前和/或将其包裹在 document.ready

$(document).ready(function() { // or $(function() {
    $('#SelectedDistrict').on('change', function () {
        ....
    });
});

旁注:将您的 jquery 版本更新到最新版本并考虑返回 json 以填充您的第二个下拉列表(请参阅 this answer

【讨论】:

  • 我已经尝试在 document.ready 中进行包装,并在您链接的帖子中尝试了建议。据我所知,这些都没有改变程序的功能。我已经放置了一些断点,似乎代码没有进入脚本。我认为我的SchoolDistrictInformation 控制器可能与它有关。我的学校表已经填充了学校表中的所有名称。
  • 我将我的版本从 3.0.2 更改为 1.10.2,现在它进入了脚本。我提到的其他一切仍然是一个问题。
  • 你指的是哪个问题。您现在已经修改了脚本以添加基于 json 的返回数据的选项,但是 GetSchools() 方法返回 html(部分视图),所以它当然不会工作。在任何情况下,你都用[HttpPost] 装饰了它(尽管它是一个GET 方法),但$.getJSON() 调用了一个GET 方法(因此得名)。如果您要使用链接中的代码,请学习并正确执行。
  • 天哪,我错过了[HttpPost],因为它很容易滚动。当我更改 JSON 方法时,我将返回部分更改为返回 json,我只是忘记更新它,对此感到抱歉。我目前所处的位置是我从第一个保管箱中所做的选择的值没有保存到视图模型/传递给GetSchools()。所以当我使用model.SelectedDistrict查询数据库时,它的值是null。因此,第二个 Dropbox 更改为有一个带有文本“请选择”的选择,因为这是脚本中文本值中的内容。
  • 我已将您的编辑回滚到原始版本,因为这是我的回答所依据的。你不能完全改变这个问题,让每个人都回答完全没用。由于我的回答中的原因,您的原始代码不起作用(脚本永远不会触发,因为它不在 $(document).ready()
【解决方案2】:

当您将学区传回 GetSchools 操作时,您应该包含属性名称

$('#SelectedDistrict').on('change', function () {
    $.ajax({
        type: "POST",
        url: 'Controller/GetSchools',
        data: { SelectedDistrict: $(this).val() },
        success: function (response) {
            $('#SelectedSchool').html(response);
        }
    });
});

【讨论】:

  • 添加属性名称并没有改变任何东西,如果有帮助的话,我的代码甚至没有到达查询,它只是停留在学区视图中
  • 它确实改变了一些东西..你只是有其他问题..确保你的url:也是正确的..最好使用@Url.Action就像url: '@Url.Action("GetSchools")'
  • 也改变了。这是一个更好的方式来看待它。不过,它仍然没有进入 GetSchools,也许它没有正确地“改变”?
  • alert("change called"); 作为函数的第一行,看看它是否被调用.. 看起来您使用的是非常旧版本的 jQuery.. 这可能是个问题
  • 好的,所以它甚至没有进入 ajax 函数。 && 是的,我在大约 30 分钟前看到了,所以我将其更改为 1.11.1 版
猜你喜欢
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多