7

我目前正在学习 ASP.NET MVC 并使用 Nhibernate。

我想使用级联下拉框。有没有人设法让级联下拉框在 MVC 中工作?

更新:我查看了以下网站:链接文本和使用的方法 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的id为1的Make时,列出了正确的汽车列表,但当我选择不同的使模型列表是空的?

4

4 回答 4

8

您可能想阅读此提示

在本技巧中,Stephen Walter 演示了创建级联下拉列表的三种方法。首先,他向您展示了如何在另一个下拉列表中的选项更改时更改一个下拉列表显示的选项列表。其次,他向您展示了如何通过控制器操作公开下拉列表的数据。接下来,他将向您展示如何从 Web 服务中获取下拉列表的数据。

于 2009-04-01T13:44:50.630 回答
4

你可能想看看我几周前发表的一篇关于这个的帖子

首先我们需要设置 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;  
} 

这个方法现在让我们能够使用漂亮的$.getJSONjquery 调用。调用的签名如下

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();

对不起无耻的插件:(

于 2010-05-20T19:00:13.317 回答
2

我为此创建了一个 jQuery 插件。

http://weblogs.asp.net/rajbk/archive/2010/05/20/cascadingdropdown-jquery-plugin-for-asp-net-mvc.aspx

于 2010-05-20T18:54:05.440 回答
1

您正在使用的提示:ASP.NET MVC 提示 #41 – 来自 Stephen Walther 的使用 Ajax 创建级联下拉列表不是用 MVC Realease 1.0 完成的

因此,它适用于下载的项目(在修复了一些小问题之后),但是当您尝试将其合并到 MVC 版本 1.0 中时,事情就会中断。

例如:在下载的项目中,脚本在 Content Folder 中,在 Release 1.0 中,脚本在 Scripts 文件夹中。

发行版中的一些(如果不是全部)*.js 文件也从赌注和 CTP 更改。这也可能是个问题。

我下载了他的项目(修复了几个小问题),它在该项目(*.js 文件)中运行良好。

例如,

我将以下内容固定为:

改变:\Views\Home\index.aspx

<label for="Makes">Car Make:</label>  
<%= Html.DropDownList("--Select Make--", "Makes") %>

到:

<label for="Makes">Car Make:</label>
<%= Html.DropDownList("Makes", (SelectList)ViewData["Makes"], "--Select Make--")%>

如您所见,存在一些问题。

这些类型的教程和博客问题很多;每个人都希望被认为是正在发布的新技术的“专家”,因此他们编写有关 beta 和 CTP 的教程。结果是“专家”将有一些不适用于最终版本的东西。

您需要找到的是已发布教程的专业人员。专业人士将确保他们的教程有效。我所说的专业人士是指该技术领域的专业培训师。

Stephen Walther 有一个更好的博客和很多好东西,但请记住,他是 Microsoift 的布道者。他撰写了有关 MS 技术的书籍,因此他需要在博客世界中保持活跃,因此他将一些好东西放在前沿技术上。这使他被视为专家,因此他的书可以出售。

请记住,无论“专家”如何,当您尝试在最终版本中使用信息时,博客/著作(基于 beta 和 CTP)都会出现不准确的情况。

于 2009-04-10T23:34:20.730 回答