【问题标题】:relation between two dropdownlist in mvcmvc中两个下拉列表之间的关系
【发布时间】:2018-04-16 07:45:03
【问题描述】:

我有两个下拉列表,当我从第一个中选择一个选项时,相关选项显示在第二个下拉列表中。我使用过 jquery,但我不知道它为什么不起作用。 这是cshtml页面:

 <div class="form-group">
        @Html.LabelFor(model => model.ProductSubGroup.ProductGroupID, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("ProductGroupID", (SelectList)ViewBag.Type, "-- انتخاب ---", htmlAttributes: new { @class = "form-control",id = "rdbGroup" })
            @Html.ValidationMessageFor(model => model.ProductSubGroup.ProductGroupID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.ProductSubGroupID, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("ProductSubGroupID", (SelectList)ViewBag.ProductSubGroupID, "-- انتخاب ---", htmlAttributes: new { @class = "form-control",id = "rdbSubGroup" })
            @Html.ValidationMessageFor(model => model.ProductSubGroupID, "", new { @class = "text-danger" })
        </div>
    </div>

这是控制器

public ActionResult SelectCategory(int id)
 {
     var categoris = db.ProductSubGroup.Where(m => m.ProductGroup.ProductGroupID == id).Select(c => new { c.ProductSubGroupID, c.ProductSubGroupTitle});
     return Json(categoris, JsonRequestBehavior.AllowGet);
 }

 // GET: Admin/Products/Create
 public ActionResult Create()
 {

     ViewBag.ProductGroupID=new SelectList(db.ProductGroup,"ProductGroupID","Produ  ctGroupTitle");
     ViewBag.ProductSubGroupID = new SelectList(db.ProductSubGroup, "ProductSubGroupID", "ProductSubGroupTitle");


         return View();
 }

这是javascript

  $('#rdbGroup').change(function () {
                jQuery.getJSON('@Url.Action("SelectCategory")', { id: $(this).attr('value') }, function (data) {
                    $('#rdbSubGroup').empty();
                    jQuery.each(data, function (i) {
                        var option = $('<option></option>').attr("value", data[i].Id).text(data[i].Title);
                        $("#rdbSubGroup").append(option);
                    });
                });
            });

【问题讨论】:

  • 任何控制台错误?
  • 什么不起作用?你的脚本正在执行吗?你在打控制器吗?你遇到了什么错误?
  • 为什么不用$(this).val() 而不是attr('value')
  • 它没有给我任何错误,但是当我选择一个组时,另一个下拉列表没有变化

标签: javascript c# jquery asp.net-mvc


【解决方案1】:

我的一个样本

cs.html

<div class="form-group">
        @Html.LabelFor(m => m.FakulteId, "Fakülte", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-6">
            @Html.DropDownListFor(m => m.FakulteId, ViewBag.Fakulte as SelectList, "Fakülte Seçiniz", htmlAttributes: new { @class = "form-control", @id = "fakulteSec", @onchange = "secim()" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.BolumId, "Bölüm", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-6">
            @Html.DropDownListFor(m => m.BolumId, ViewBag.Bolum as SelectList, "Bölüm Seçiniz", htmlAttributes: new { @class = "form-control", @id = "bolum" })
        </div>
    </div>

控制器

public JsonResult FakulteBolumDrop(int id)
    {
        db.Configuration.ProxyCreationEnabled = false;
        List<Bolum> bolum = db.Bolum.Where(b => b.FakulteId == id).ToList();
        return Json(bolum, JsonRequestBehavior.AllowGet);
    }

.js

function secim() {
        var fakulteId = $('#fakulteSec').val();
        //alert(fakulteId);
        $.ajax({
            url: '/Rektor/FakulteBolumDrop?id=' + fakulteId,
            type: "POST",
            dataType: "JSON",
            data: { Fakulte: fakulteId },
            success: function (bolumler) {
                $("#bolum").html("");
                $.each(bolumler, function (i, bolum) {
                    $("#bolum").append(
                        $('<option></option>').val(bolum.BolumId).html(bolum.Adi));
                });
            }
        });
    }

【讨论】:

  • 你知道3个相关的下拉菜单吗?
  • 我之前没做过。可以用同样的方法。将onchange添加到第二个下拉列表
  • 发生了一个小问题,当我将它用于 3 个下拉列表时,当我从第一个下拉列表中选择一个项目时,第二个下拉项目实现,而第三个显示所有项目,而不是第二个下拉列表中的依赖项,我应该在第二个更改项目,即使我想在第二个下拉列表中有最火的项目
【解决方案2】:

您必须在

中注册 rdbGroup Drop Down 的更改事件
 $(document).ready(function(){

  });

否则不会被解雇。

【讨论】:

  • 不一定——脚本可能在页面底部。
【解决方案3】:

使用this.value 或$(this).val() 代替$(this).attr('value')。

试试

 $('#rdbGroup').on('change',function () {// or $(document).on('change', '#rdbGroup',function (){
      $.getJSON('@Url.Action("SelectCategory")', { id: this.value }, function (data) {
       $('#rdbSubGroup').empty();
       $.each(data, function (i,item) {// if data is json string form the replace data by $.parseJSON(data)
          //console.log(item.Id); console.log(item.Title);
          $('#rdbSubGroup').append($('<option>', { 
               value:item.Id,
               text :item.Title 
        })); //OR you can use --- $('#rdbSubGroup').append($("<option></option>").attr("value",item.Id).text(item.Title)); 
         });
      });
    });

或

$('#rdbGroup').on('change',function () {// or $(document).on('change', '#rdbGroup',function (){
   var id= this.value;
    $.ajax({
        url: '@Url.Action("SelectCategory")',
        data: { 
            id: id
          },
        dataType: 'json',
        async: false
    }).done(function (data) {
        $("#rdbSubGroup").html("");           
        $.each(data, function (i,item) {         
            $('#rdbSubGroup').append($("<option></option>").attr("value",item.Id).text(item.Title)); 
            //OR $('#rdbSubGroup').append($('<option>', { value:item.Id, text :item.Title}));    
          });
       });        
    });

【讨论】:

  • 嗨,谢谢你的回复,我已经按照你说的做了,但是当我选择一个组时,第二个下拉列表什么都没有显示,而且它是空白的
  • @Mansoure 我稍微更新了我的答案。取消注释//console.log(item.Id); console.log(item.Title); 并确保此日志在浏览器开发者工具控制台中的有效数据。
  • 当我在 selectcategory 函数上设置断点时,信息是正确的,只是在第二个下拉列表中显示,它显示为空白
  • @Mansoure 请尝试在下拉列表中添加选项的替代选项
  • 我是新人,请您指导我吗?
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2011-04-22
  • 2016-06-27
  • 2017-07-31
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多