【问题标题】:Cascading drop down wont populate MVC5级联下拉不会填充 MVC5
【发布时间】:2015-09-01 18:22:32
【问题描述】:

我对 MVC 很陌生,我正在尝试创建一个级联下拉菜单。用户将选择诊所的名称,下面的下拉菜单将填充在该诊所工作的配镜师的姓名。

眼镜师模型:

public class Optician
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid OpticianId { get; set; }

[ForeignKey("User")]
public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }
public IEnumerable<SelectListItem> UserList { get; set; }

[ForeignKey("Practice")]
public Guid PracticeId { get; set; }
public virtual Practice Practice { get; set; }
public IEnumerable<SelectListItem> PracticeList { get; set; }

public virtual ICollection<ApplicationUser> Users { get; set; }

public virtual ICollection<Practice> Practices { get; set; }
}

实践模型:

public class Practice
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Display(Name = "Practice")]
public Guid PracticeId { get; set; }

[Display(Name = "Practice Name")]
public string PracticeName { get; set; }


public virtual ICollection<Optician> Opticians { get; set; }

public virtual ICollection<Booking> Bookings { get; set; }
}

应用用户模型:

public class ApplicationUser : IdentityUser
{
[Display(Name = "Title")]
public string Title { get; set; }

[Display(Name = "First Name")]
public string FirstName { get; set; }

[Display(Name = "Last Name")]
public string LastName { get; set; }
}

控制器:

public ActionResult TestDropDown()
    {

        var practices = new SelectList(db.Practices, "PracticeId", "PracticeName");
        ViewData["Practices"] = practices;

        return View();
    }

    [HttpPost]
    public JsonResult Opticians(Guid? Id)
    {
        var opticianList = db.Opticans.Where(a => a.PracticeId == Id).Select(a => a.User).ToList();


        return Json(opticianList, JsonRequestBehavior.AllowGet);
    }

观点:

<script src="~/Scripts/jquery-1.10.2.js"></script>

<script>
$(document).ready(function () {
    $("#Optician").prop("disabled", true);
    $("#Practice").change(function () {
        $.ajax({
            url : "@Url.Action("Opticians","Bookings1")",
            type : "POST",
            data : {Id : $(this).val() }
        }).done(function(OpticianList){
            $("#Optician").empty();
            for (var i = 0; i < OpticianList.length; i++) {
                $("#Optician").append("<option>" + OpticianList[i].FirstName + "</option>");
            }
            $("#Optician").prop("disabled", false);
        });
});
});

</script>


@using (Html.BeginForm("TestDropDown", "Bookings1", FormMethod.Post))
{
@Html.AntiForgeryToken()
<h4>Select Practcie & Opticians</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
    @Html.Label("Select Practice :", new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.DropDownList("PracticeId", ViewData["Practices"] as SelectList, new { @class = "form-control" })
    </div>
</div><br />
<div class="form-group">
    @Html.Label("Select Optician :", new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        <select id="Optician"></select>
    </div>
</div>
<div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <input type="submit" class="btn btn-default" value="Submit" />
    </div>
</div>
}

我可以选择诊所的名称,但没有填充眼镜师名字的下拉菜单。 任何帮助将不胜感激 谢谢

【问题讨论】:

  • 您在浏览器控制台中遇到什么错误?
  • 如果您只想要ApplicationUserFirstName 属性,那么它应该是.Select(a =&gt; a.User.FirstName) - 当您甚至不需要时将大量额外数据发送回浏览器是没有意义的使用它
  • @StephenMuecke 谢谢。浏览器控制台没有错误
  • $("#Practice").change(function () { 函数永远不会被击中 - 你的第一个下拉菜单是 &lt;select id=PracticeId" ..&gt; 而不是 Practice
  • @StephenMuecke 谢谢斯蒂芬,我改变了它,眼镜商下拉菜单似乎正在填充,但下拉菜单中的两个选项显示为“未定义”

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


【解决方案1】:

您首先 &lt;select&gt;id="PracticeId" 但您的脚本引用了带有 id="Practice" 的元素,该元素不存在,因此永远不会运行。将您的脚本更改为

var optician = $("#Optician"); // cache elements that you repeately refer to
optician.prop("disabled", true);
$("#PracticeId").change(function () { // change the selector
  $.ajax({
      url : "@Url.Action("Opticians","Bookings1")",
      type : "POST",
      data : {Id : $(this).val() }
  }).done(function(OpticianList){
      optician.empty();
      for (var i = 0; i < OpticianList.length; i++) {
          optician.append("<option>" + OpticianList[i].FirstName + "</option>");
      }
      optician.prop("disabled", false);
  });
});

或者你可以使用.getJSON() 快捷方式

$.getJSON('@Url.Action("Opticians","Bookings1")', { Id : $(this).val() }, function(OpticianList) {
  // add the option elements
}

由于您只需要ApplicationUserFirstName 属性,因此您的控制器代码应该是

var opticianList = db.Opticans.Where(a => a.PracticeId == Id).Select(a => a.User.FirstName)

脚本调整为

optician.append("<option>" + OpticianList[i] + "</option>");

optician.append($('<option></option>').text(OpticianList[i]));

因此您不会通过网络发回大量您从未使用过的额外数据。

【讨论】:

    【解决方案2】:

    在你的行动中试试这个:

        [HttpPost]
        public JsonResult Opticians(Guid? Id)
        {
            var opticianList = db.Opticans.Where(a => a.PracticeId == Id).Select(a => a.User).ToList();
            SelectList mySelectList = new SelectList(opticianList, "IDField", "DisplayField", 0);
    
            return Json(mySelectList );
        }
    

    这是我实现此功能时关注的帖子。 Fill drop down list on selection of another drop down list

    【讨论】:

    • 废话。为什么要发回额外的属性,例如SelectListItemSelected 属性。如果你需要添加 SelectList 那么你做错了什么
    • @akemp 我试过了并更新了脚本,但它仍然无法正常工作
    猜你喜欢
    • 2023-03-07
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多