填充列表的有效方法-ASP.NET MVC3

本文关键字:-ASP NET MVC3 方法 有效 列表 填充 | 更新日期: 2023-09-27 18:20:02

我是ASP.NET MVC 3的新手,来自RoR,所以我对MVC设计模式有些熟悉。

我创建了一个方法,该方法生成一个要在dropdownfor()中使用的选择列表。

我下面的方法很有效,但我想知道我是否可以让它更高效,或者至少用更少的代码做同样的事情?

感谢

public static IEnumerable<SelectListItem> GetDistanceUnits(string distanceUnit)
    {
        DistanceUnit MilesUnit = new DistanceUnit();
        MilesUnit.OptionValue = "mi";
        MilesUnit.OptionName = "Miles";
        MilesUnit.OptionSelected = "";
        DistanceUnit KilometersUnit = new DistanceUnit();
        KilometersUnit.OptionValue = "km";
        KilometersUnit.OptionName = "Kilometers";
        KilometersUnit.OptionSelected = "";
        var distanceUnitList = new List<SelectListItem>();
        distanceUnitList.Add(new SelectListItem
        {
            Value = MilesUnit.OptionValue,
            Text = MilesUnit.OptionName,
            Selected = MilesUnit.OptionSelected == distanceUnit
        });
        distanceUnitList.Add(new SelectListItem
        {
            Value = KilometersUnit.OptionValue,
            Text = KilometersUnit.OptionName,
            Selected = KilometersUnit.OptionSelected == distanceUnit
        });
        return distanceUnitList.OrderByAscending(c => c.Text);
    }

填充列表的有效方法-ASP.NET MVC3

您可以使用生成器创建列表,并使用一个小Linq来投影列表。

public static IEnumerable<SelectListItem> GetDistanceUnits(string distanceUnit)
{
    var distanceUnitList = GetUnits()
                                .Select(u =>
                                    new SelectListItem
                                        {
                                            Value = u.OptionValue,
                                            Text = u.OptionName,
                                            Selected = u.OptionSelected == distanceUnit
                                        })
                                .OrderByAscending(c => c.Text)
                                .ToList();
    return distanceUnitList;
}
private static IEnumerable<DistanceUnit> GetUnits()
{
    yield return new DistanceUnit
                    {
                        OptionValue = "mi";
                        OptionName = "Miles";
                        OptionSelected = "";
                    };
    yield return new DistanceUnit
                    {
                        OptionValue = "km";
                        OptionName = "Kilometers";
                        OptionSelected = "";
                    };
}

您可以使用如下列表初始值设定项来进一步压缩代码:

var distanceUnitList = new List<SelectListItem> {
    new SelectListItem {
        Value = MilesUnit.OptionValue,
        Text = MilesUnit.OptionName,
        Selected = MilesUnit.OptionSelected == distanceUnit
    },
    new SelectListItem {
        Value = KilometersUnit.OptionValue,
        Text = KilometersUnit.OptionName,
        Selected = KilometersUnit.OptionSelected == distanceUnit
    }
};

否则,我会说这是一个非常紧凑的方法,组织良好,并且在MVC应用程序的其他领域中可以非常重用。

你可以用更少的代码来实现它,但我不确定它会有多高效:

var distanceUnitList = new List<SelectListItem>
                                               {
                                                   new SelectListItem{...},
                                                   new SelectListItem{...},
                                               };

如果只使用这些局部变量一次(向SelectListItem提供数据),则不需要它们。您可以执行以下操作:

var distanceUnitList = new List<SelectListItem>() {
    new SelectListItem
    {
        Value = "mi",
        Text = "Miles",
        Selected = ("" == distanceUnit) // odd code...
    }, 
    new SelectListItem
    {
        Value = "km",
        Text = "Kilometers",
        Selected = ("" == distanceUnit)
    }
};