I want to create two DropDownList in a cascade using MVC3 (preferably Razor) with C#.

我想有一个下拉列表,你可以 Select 一年,另一个,你可以 Select 一个具体的月取决于所选的年份.

让我们简单地说.当我在下拉列表"Year"中 Select 当前年份(即2011年)时,下拉列表"Month"将填充到当前月份(即3月)为止的月份.其他情况(其他年份)不受限制.此外,在 Select 下拉列表"年"中的任何元素之前,最好先"挡路"下拉列表"月".

我已经在互联网上寻找了一些解决方案,使用了jQuery种甚至是brew 的方法,但它们都参考了MVC的过go 版本,有些命令在MVC3中被弃用.

推荐答案

和往常一样,你从一个模型开始:

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

and finally a view:

@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>

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

Json相关问答推荐

从Razor Pages的AJAX Json呈现DataTables问题.Net GET

当console.log返回TRUE值时,解析的JSON中的字段未定义

Jolt规范:将嵌套数组中的null元素移除

将 GEOSwift.JSON 转换为 Swift 中的 struct

Powershell 7.2:ConvertFrom-Json - 日期处理

流编写器未写入 webapi 中的 JSON 文件

Vue 3如何将参数作为json发送到axios get

在 Flutter 中将对象转换为可编码对象失败

PowerShell - JSON/PsCustomObject - 为什么我的数组被扁平化为一个对象?

为什么我不能在 C# 中引用 System.Runtime.Serialization.Json

在 JavaScript 中从 Json 数据中删除反斜杠

Jackson:忽略 Json 配置值

Retrofit2.0 得到 MalformedJsonException 而 json 似乎正确?

在 Java 中比较两个 JSON 文件的最佳方法

JSON JQ 如果没有 else

设置对象不是 JSON 可序列化的

从 JSON 到 JSONL 的 Python 转换

从 JSON 中 Select 不同的值

为什么 RestTemplate 不将响应表示绑定到 PagedResources?

Java HashMap 与 JSONObject