2013-06-25 36 views
1

我是新來的ASP.NET MVC 3,來自RoR,所以我對MVC設計模式有點熟悉。填充列表的有效方法 - ASP.NET MVC3

我創建了一個方法,用於生成一個在下拉列表中使用的選擇列表()。

我在下面的工作,但我想知道如果我可以使它更有效率,或者至少用更少的代碼做同樣的事情?

感謝

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

回答

4

可以使用generator創建列表和一點點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 = ""; 
        }; 
} 
+0

+1我喜歡這樣,因爲如果單位需要來自數據庫或Web服務'GetUnits()'可以很容易地適應。做得好。 – Yuck

+0

非常模塊化和可擴展。謝謝 – Slinky

+0

@Slinky我很高興你覺得它有用! – Romoku

4

您可以通過使用列表初始化像這樣凝結代碼多一點點:

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應用程序的其他區域中重用。

+0

啊,你打我吧! – wilsjd

+0

啊......這樣比較好。謝謝 – Slinky

0

你可以用少一點的代碼做了,但我不知道它是如何更有效的是:

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

如果您打算只使用這些局部變量一次(將數據提供給SelectListItem),則不需要它們。你可以做到以下幾點:

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