I'm currently learning ASP.NET MVC and using Nhibernate.
I would like to use Cascading Drop-Down Boxes. Has anyone managed to get cascading drop-down boxes working in MVC?
Updated: I have looked at the following website: link text and used method 1.
Controller Code
var makeList = new SelectList(makeRepository.ListMakes (), "Id", "make",1);
ViewData["Makes"] = makeList;
//// Create Models view data
var modelList = new CascadingSelectList(modelRepository.ListModels (Convert.ToInt32(makeList.SelectedValue.ToString())), "ModelID","Id", "Name");
ViewData["Models"] = modelList;
View Code
<%= Html.DropDownList("--Select Make--","Makes")%>
<label for="Makes">Car Model:</label>
<%= Html.CascadingDropDownList("Models", "Makes") %>
The correct list of cars is listed when a Make with id of 1 is selected, but when I select a different make the model list is empty?
You may want to read this TIP.
In this tip, Stephen Walter demonstrates three methods of creating cascading dropdown lists. First, he shows you how to alter the list of options displayed by one dropdown list when an option in another dropdown list changes. Second, he shows you how to expose the data for the dropdown lists through a controller action. Next, he shows you how to grab the data for the dropdown lists from web services.
You might want to have a look at a post I made a couple of weeks ago on exactly this
First we will need to setup the JsonResult controller action.
/// <summary></summary>
/// Get Models
/// <param name="makeID" />
/// <returns></returns>
public JsonResult GetModels(string id)
{
JsonResult result = new JsonResult();
var filteredModels = from model in homeViewModel.Models
where model.MakeID.ToString() == id
select model; result.Data = filteredModels.ToList();
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return result;
}
This method now gives us the ability to use the nifty
$.getJSON
jquery call. The signature for the call is as follows
jQuery.getJSON( url, [ data ], [ callback(data, textStatus) ] )
Given that we have setup 2 Drop Down Lists, one for Makes and the other for Models, like so.
Html.DropDownListFor((model) => model.MakeID, new SelectList(Model.Makes, "ID", "Description"))
Html.DropDownListFor((model) => model.ModelID, new SelectList(Model.Models, "ID", "Description"))
we can include the following bit of jquery
//Hook onto the MakeID list's onchange event
$("#MakeID").change(function() {
//build the request url
var url = '<!--Url.Content("~/")-->' + 'Home/GetModels';
//fire off the request, passing it the id which is the MakeID's selected item value
$.getJSON(url, { id: $("#MakeID").val() }, function(data) {
//Clear the Model list
$("#ModelID").empty();
//Foreach Model in the list, add a model option from the data returned
$.each(data, function(index, optionData) {
$("ModelID").append("<option value=" + optionData.ID +">"+ optionData.Description +"</option>" );
});
});
}).change();
Sorry for the shameless plug :(
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With