使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法

Posted

技术标签:

【中文标题】使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法【英文标题】:Easiest way to create a cascade dropdown in ASP.NET MVC 3 with C# 【发布时间】:2011-07-26 17:36:20 【问题描述】:

我想使用MVC3(最好是Razor)和C#在一个级联中创建两个DropDownList

我希望有一个下拉菜单供您选择年份,而另一个下拉菜单供您根据所选年份选择一组特定月份。

让我们简单地说。当我在下拉列表“年”中选择当前年份(即 2011 年)时,下拉列表“月”将填充当前月份(即 3 月)之前的月份。对于其他情况(其他年份)没有限制。此外,最好在选择下拉列表“年”中的任何元素之前“阻止”下拉列表“月”。

我已经在 Internet 上查找了一些解决方案,使用 jQuery 甚至是自制的方法,但它们都引用了 MVC 的过去版本,并且在 MVC3 中不推荐使用某些命令。

【问题讨论】:

【参考方案1】:

一如既往地从模型开始:

public class MyViewModel

    public int? Year  get; set; 
    public int? Month  get; set; 

    public IEnumerable<SelectListItem> Years
    
        get
        
            return Enumerable.Range(2000, 12).Select(x => new SelectListItem
            
                Value = x.ToString(),
                Text = x.ToString()
            );
        
    

然后是控制器:

public class HomeController : Controller

    public ActionResult Index()
    
        var model = new MyViewModel();
        return View(model);
    

    public ActionResult Months(int year)
    
        if (year == 2011)
        
            return Json(
                Enumerable.Range(1, 3).Select(x => new  value = x, text = x ), 
                JsonRequestBehavior.AllowGet
            );
        
        return Json(
            Enumerable.Range(1, 12).Select(x => new  value = x, text = x ),
            JsonRequestBehavior.AllowGet
        );
    

最后是一个视图:

@model AppName.Models.MyViewModel

@html.DropDownListFor(
    x => x.Year, 
    new SelectList(Model.Years, "Value", "Text"),
    "-- select year --"
)

@Html.DropDownListFor(
    x => x.Month, 
    Enumerable.Empty<SelectListItem>(),
    "-- select month --"
)

<script type="text/javascript">
    $('#Year').change(function () 
        var selectedYear = $(this).val();
        if (selectedYear != null && selectedYear != '') 
            $.getJSON('@Url.Action("Months")',  year: selectedYear , function (months) 
                var monthsSelect = $('#Month');
                monthsSelect.empty();
                $.each(months, function (index, month) 
                    monthsSelect.append($('<option/>', 
                        value: month.value,
                        text: month.text
                    ));
                );
            );
        
    );
</script>

显然您会注意到,在我的示例中,我已对所有值进行了硬编码。您应该通过使用诸如当年、当前月份之类的概念来改进此逻辑,甚至可能从存储库中获取这些值等等......但出于演示的目的,这应该足以让您走上正确的轨道。

【讨论】:

回答速度惊人,完整且容易理解!非常感谢! 我需要在程序中添加任何特殊的 AJAX 引用吗?谢谢 @Francesco,是的,你需要 jquery。 是怎么回事?我不明白。 Roberto Bonini, 是选择列表项。它附加在列表元素中。

以上是关于使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用 EF 在 ASP.Net MVC 应用程序中创建 3 层架构?

在 ASP.NET MVC 3 中创建基于平台显示不同视图的自定义 ViewResult

在 Asp.net Identity MVC 5 中创建角色

如何在 ASP.NET MVC 中创建 CheckBoxListFor 扩展方法?

如何在 asp.net mvc 中创建审计日志/审计跟踪

如何在 ASP.NET MVC 视图中用 C# 打印出 GridView?