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


69

我想使用(最好是)与创建DropDownList一个层叠MVC3RazorC#

我想有一个下拉菜单,您可以在其中选择年份,而在另一个下拉列表中,可以根据所选年份选择特定的月份集。

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

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

Answers:


140

与往常一样,您从模型开始:

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>

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


4
快速,完整,轻松地回答您!非常感谢你!
CiccioMiami 2011年

我需要在程序内添加任何特殊的AJAX引用吗?谢谢
CiccioMiami 2011年

3
@Francesco,是的,您需要使用jQuery。
Darin Dimitrov

1
<option />是什么?我不明白
罗伯托·博尼尼

1
Roberto Bonini,<option />是selectlistitem。它被附加在list元素内。
肖恩·麦克林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.