我目前正在学习ASP.NET MVC并使用Nhibernate。
我想使用Cascading Drop-Down Boxes。有没有人设法在MVC中使用级联下拉框?
更新: 我查看了以下网站:link text并使用了方法1.
控制器代码
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;
查看代码
<%= Html.DropDownList("--Select Make--","Makes")%>
<label for="Makes">Car Model:</label>
<%= Html.CascadingDropDownList("Models", "Makes") %>
当选择了ID为1的Make时,会列出正确的汽车列表,但是当我选择其他品牌时,模型列表为空?
答案 0 :(得分:8)
您可能需要阅读此TIP。
在本文中,Stephen Walter演示了三种创建级联下拉列表的方法。首先,他向您展示了当另一个下拉列表中的选项发生更改时,如何更改一个下拉列表中显示的选项列表。其次,他向您展示了如何通过控制器操作公开下拉列表的数据。接下来,他向您展示了如何从Web服务中获取下拉列表的数据。
答案 1 :(得分:4)
你可能想看一下我几周以前发表的post
首先,我们需要设置JsonResult控制器动作。
/// <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;
}
此方法现在使我们能够使用漂亮的
$.getJSON
jquery 呼叫。呼叫的签名如下
jQuery.getJSON( url, [ data ], [ callback(data, textStatus) ] )
鉴于我们已经设置了2个下拉列表,一个用于制作和 其他的模特,像这样。
Html.DropDownListFor((model) => model.MakeID, new SelectList(Model.Makes, "ID", "Description"))
Html.DropDownListFor((model) => model.ModelID, new SelectList(Model.Models, "ID", "Description"))
我们可以包含以下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();
抱歉无耻插头:(
答案 2 :(得分:2)
我为此创建了一个jQuery插件。
http://weblogs.asp.net/rajbk/archive/2010/05/20/cascadingdropdown-jquery-plugin-for-asp-net-mvc.aspx
答案 3 :(得分:1)
您正在使用的提示:ASP.NET MVC提示#41 - 使用来自Stephen Walther的Ajax创建级联下拉列表未完成MVC Realease 1.0
因此,它适用于下载的项目(在修复一些小问题之后),但是当你尝试合并到MVC Release 1.0中时,事情就会中断。
例如:在下载的项目中,脚本位于内容文件夹中,在1.0版中,脚本位于Scripts文件夹中。
此版本中的一些(如果不是全部)* .js文件也改变了赌注和CTP。这也可能是个问题。
我下载了他的项目(修复了一些小问题),它在该项目中运行良好(* .js文件)。
例如,
我修正了以下内容:
更改:\Views\Home\index.aspx
<label for="Makes">Car Make:</label>
<%= Html.DropDownList("--Select Make--", "Makes") %>
TO:
<label for="Makes">Car Make:</label>
<%= Html.DropDownList("Makes", (SelectList)ViewData["Makes"], "--Select Make--")%>
如您所见,存在一些问题。
教程和博客的这些类型问题很多;每个人都希望被视为正在发布的新技术的“专家”,因此他们编写了有关beta和CTP的教程。结果是“专家”将拥有与最终版本无关的内容。
您需要找到的是发布教程的专业人士。专业人员将确保他们的教程有效。我所说的专业人士是该技术领域的专业培训师。
斯蒂芬沃尔特有一个更好的博客和很多好东西,但请记住,他是一个微博客传播者。他撰写有关MS技术的书籍,因此他需要积极参与博客世界,因此他将一些优秀的东西放在前沿技术上。这使他被视为专家,因此他的书可以出售。请记住,无论“专家”如何,当您尝试在最终版本中使用这些信息时,博客/文章(基于测试版和CTP)都会出现不准确之处。