2014-01-10 148 views
1

我在编程初学者粘在了最后2天,我跳在你的帮助:)三级级联下拉列表

我建立一个MVC 4应用程序,我有一个局部视图部门列表,当您选择部门时,您可以在“浏览”视图的下拉列表中查看此特定部门的项目类型。

我试图做的是在浏览视图中的一个更多的下拉列表,它将根据选定的部门和项目类型显示项目。

所以这是我的代码:

查看:

@using (Html.BeginForm("Browse", "Bookings", FormMethod.Post, new { id = "TypeItemFormID", data_itemsListAction = @Url.Action("ItemsList") })) 
{ 
<fieldset> 
    <legend> Type/Item</legend> 
    @Html.DropDownList("department", ViewBag.ItemTypesList as SelectList, "Select a Type", new {id="ItemTypeID"}) 
    <div id="ItemsDivId"> 
     <label for="Items">Items </label> 
     <select id="ItemsID" name="Items"></select> 
    </div> 
    <p> 
     <input type ="submit" value="Submit" id="SubmitID" /> 
    </p> 
</fieldset> 
} 
<script src ="@Url.Content("~/Scripts/typeItems.js")"></script> 

控制器:

public class BookingsController : Controller 
    { 

     private BookingSystemEntities db = new BookingSystemEntities(); 
     // 
     // GET: /Bookings/ 

     public ActionResult Index() 
     { 
      ViewBag.Message = "Select your Department"; 
      var departments = db.Departments.ToList(); 
      return View(departments); 
     } 

     public ActionResult Browse(string department, string ID) 
     { 

      ViewBag.Message = "Browse for Equipment"; 

      var departments = db.Departments.Include("Items").Single(i => i.DepartmentName == department); 

      ViewBag.ItemTypesList = GetItemTypeSelectList(department); 

      return View(); 

     } 

     public ActionResult Details(int id) 
     { 
      var item = db.Items.Find(id); 

      return View(item); 
     } 

     // 
     // GET: /Home/DepartmentMenu 
     [ChildActionOnly] 
     public ActionResult DepartmentMenu() 
     { 
      var departments = db.Departments.ToList(); 
      return PartialView(departments); 
     } 


     public SelectList GetItemTypeSelectList(string department) 
     { 
      var departments = db.Departments.Include("Items").Single(i => i.DepartmentName == department); 
      List<SelectListItem> listItemTypes = new List<SelectListItem>(); 
      foreach (var item in departments.Items.Select(s => s.ItemType.ItemTypeName).Distinct()) 
      { 
       listItemTypes.Add(new SelectListItem 
       { 
        Text = item, 
        Value = item, 
       } 

        ); 
      } 

      return new SelectList(listItemTypes.ToArray(), 
           "Text", 
           "Value"); 

     } 

     public ActionResult ItemsList(string ID) 
     { 
      string Text = ID; 
      var items = from s in db.Items 
         where s.ItemType.ItemTypeName == Text 
         select s; 

      if (HttpContext.Request.IsAjaxRequest()) 
       return Json(new SelectList(
           items.ToArray(), 
           "ItemId", 
           "ItemName") 
          , JsonRequestBehavior.AllowGet); 

      return RedirectToAction("Browse"); 
     } 


    } 

的JavaScript:

$(function() { 

    $('#ItemsDivId').hide(); 
    $('#SubmitID').hide(); 

    $('#ItemTypeID').change(function() { 
     var URL = $('#TypeItemFormID').data('itemsListAction'); 
     $.getJSON(URL + '/' + $('#ItemTypeID').val(), function (data) { 
      var items = '<option>Select a Item</option>'; 
      $.each(data, function (i, item) { 
       items += "<option value='" + item.Value + "'>" + item.Text + "</option>"; 
       // state.Value cannot contain ' character. We are OK because state.Value = cnt++; 
      }); 
      $('#ItemsID').html(items); 
      $('#ItemsDivId').show(); 

     }); 
    }); 

    $('#ItemsID').change(function() { 
     $('#SubmitID').show(); 
    }); 
}); 

,最后我的模型:

public class Department 
    { 
     public int DepartmentId { get; set; } 

     [DisplayName("Department")] 
     public string DepartmentName { get; set; } 

     public List<Item> Items { get; set; } 

    } 

public class ItemType 
    { 
     public int ItemTypeId { get; set; } 

     [DisplayName("Type")] 
     public string ItemTypeName { get; set; } 

     [DisplayName("Image")] 
     public string ItemTypeImage { get; set; } 

     public List<Item> Items { get; set; } 

    } 

public class Item 
    { 
     public int ItemId { get; set; } 

     [DisplayName("Name")] 
     public string ItemName { get; set; } 

     [DisplayName("Description")] 
     public string ItemDescription { get; set; } 

     [DisplayName("Ref Code")] 
     public string ItemReferenceCode { get; set; } 

     [ForeignKey("ItemType")] 
     public int ItemTypeId { get; set; } 
     public virtual ItemType ItemType { get; set; } 

     [ForeignKey("Department")] 
     public int DepartmentId { get; set; } 
     public Department Department { get; set; } 

     [DisplayName("Computer Location")] 
     public string ComputerLocation { get; set; } 

     [DisplayName("Author Name")] 
     public string AuthorName { get; set; } 

     [DisplayName("Published Year")] 
     public string PublishedYear { get; set; } 

    } 
+0

对不起,我不知道你在问什么,因为你的帖子中没有实际的问题。你能澄清一下吗? – tnw

+0

我实际上可以在部分视图中看到部门的细节,然后按照第一个下拉列表中的部门加载项目类型,但是我的第三个下拉列表只是空的,根本不会加载任何值。我还提到表单不会选择方法ItemsList?如果你能帮忙,我就跳了......我没有错误,只是我的第三个下拉列表中的值不会加载.. – Wizeman1986

+0

有用的提示:通过在你的问题中使用正确的语法和标点符号,你会得到更快的帮助和更好的答案。 。 –

回答

2

这是我会怎么做到这样的事情。这不是唯一的方法。

$('#ItemTypeID').on('change', function() { 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("GetItemTypeForm")', 
      data: { itemTypeId: $('#ItemTypeID').val() }, 
      success: function(results) { 
       var options = $('#ItemTypeFormId'); 
       options.empty(); 
       options.append($('<option />').val(null).text("- Select an Item Type -")); 
       $.each(results, function() { 
        options.append($('<option />').val(this.ItemTypeFormId).text(this.Value)); 
       }); 
      } 
     }); 
    }); 

然后你会看到类似这样的控制器。

[HttpPost] 
    public JsonResult GetItemTypeForm(string itemTypeId) 
    { 
     //pseudo code 
     var data = Repostitory.GetData(itemTypeId) 

     return Json(data); 
    } 
+0

感谢您花时间帮助我,不幸的是仍然是第三个下拉列表,其中的项目是空的,没有任何值:( – Wizeman1986

+0

您需要进行一些调试,您的问题可能来自大量潜在的地方。这个问题可以在JavaScript端或控制端,在你的控制器代码中放入中断,并确保你的javascript调用了适当的控制器方法,然后确保它获得了合适的查找ID,然后确保它发送了合适的json使用fiddler或chrome开发者工具),如果是这样的话,问题在于如何使用javascript构建下拉列表,请确保这{。您的值名称}与json结果匹配。 – cgotberg