2011-06-20 8 views
1

一部のビューには、同じように見えるいくつかの<div>が含まれています。その順番にそれぞれDropdownListが含まれています。さて、DropdownListsで選択された値は、通常は異なります。そして、値の最初のリストは、いくつかの外部ソースから来ます。 だからwould't作業:コントローラ内からDropDownListを簡単に作成するには

public PartialViewResult GetMeals() 
{ 
     var meals = DataContext.GetMeals(); 
     ViewBag.Units = new SelectList(DataContext.GetUnits,"Id","Name"); 

     return PartialView("_Meals", meals); 
} 

@foreach (var m in Meals) 
{ 
    <div> 
     @Html.DropDownList("Units", ViewBag.Units as List<SelectListItem>) 
    <dig> 

私はもちろん、各食事のための別の部分図を作成することができますが、私はしたくは部分図の階層に入ると別の部分内側部分を作成しない(レオ・ディカプリオが、あなたはそれを愛するでしょう)

あなたは私に助言を与えることができますか?

答えて

2

ここで私は何をしますか?この最初のことは、ViewBagを取り除くことです。次に、ビューモデルを定義します。

public class MealViewModel 
{ 
    public string MealDescription { get; set; } 

    public string SelectedUnit { get; set; } 
    public IEnumerable<SelectListItem> Units { get; set; } 
} 

このビューモデルでは、ビュー(この場合は部分図)に必要なもののみを配置します。

、その後、私は私のコントローラのアクションを持っているでしょうが、あなたが好きな場所からデータを集約することで、このビューモデルを移入:

public ActionResult GetMeals() 
{ 
    var meals = DataContext.GetMeals().ToList(); // <-- being eager with .ToList() 
    var units = DataContext.GetUnits().ToList(); // <-- being eager with .ToList() 
    var viewModel = meals.Select(meal => new MealViewModel 
    { 
     MealDescription = meal.Description, 
     SelectedUnit = meal.UnitId, 
     Units = units.Select(unit => new SelectListItem 
     { 
      Value = unit.Id.ToString(), 
      Text = unit.Name 
     }) 
    }); 
    return PartialView("_Meals", viewModel); 
} 

と部分_Mealsの内側に私は、エディタのテンプレートを使用します。

@model IEnumerable<MealViewModel> 
@Html.EditorForModel() 

と最後に、食事のエディタテンプレートを定義します:

~/Views/Shared/EditorTemplates/MealViewModel.cshtml

入力コントロールが間違っているループやキャストが増えました。

コントローラのアクションを見ると、あなたの気になるものがなければなりません。これはドメインモデルとビューモデルの間のこの繰り返しマッピングコードです。 AutoMapperの世界に入り、あなたは本当にかわいいコードを得るでしょう。

+1

ダーリン...あなたは最高です!いつものように... – Agzam

関連する問題