0

ユーザーのリストを表示しています。各ユーザー レコードには、TrainingEvent オブジェクト プロパティがあります (多数の TrainingEvent から選択されます)。User リストと TrainingEvents リストを含むビューモデルを作成しました。

ビューモデル:

public class RegistrationViewModel
{
  public IEnumerable<Domain.Entities.User> Users { get; set; }
  public IEnumerable<SelectListItem> TrainingEvents { get; set; }
}

(注: Domain.Entities.User には TrainingEvent オブジェクト プロパティが含まれています)

コントローラ:

public ActionResult Dealership(int id)
{
  var model = new RegistrationViewModel
    {
      Users = repository.Find
             .Where(u => u.Dealer.DealerId == id).OrderBy(u => u.LastName),
                 TrainingEvents = repository.TrainingEvents.ToList()
                                  .Select(x => new SelectListItem
                                          {
                                            Text = x.Date.ToString() + " - " + x.LocationName,
                                            Value = x.TrainingEventId.ToString()
                                          })
    };

  return View("East", model);
}

ビューでのバインディング:

@foreach(Company.Domain.Entities.User usr in Model.Users)
  {
     <tr>
         <td>@usr.LastName</td>
         <td>@usr.FirstName</td>
         <td>@usr.JobDescription</td>
         <td>@Html.DropDownListFor(m => m.Users.FirstOrDefault(u => u.UserId == usr.UserId).TrainingEvent, Model.TrainingEvents)</td>
     </tr>
}

ユーザーが一覧表示され、各ユーザー行には、TrainingEvents が取り込まれるドロップダウンがあります。ただし、以前にユーザーの TrainingEvent オブジェクトに保存された値は選択されていません。なぜそうしないのかというアイデアはありますか?

4

1 に答える 1

3

DropDownListForヘルパーの使い方が間違っています。このヘルパーは、最初の引数として、最大でメンバー アクセスを含む単純なラムダ式が渡されることを想定しています。あなたの例FirstOrDefaultでは、サポートされていない拡張メソッドなどを使用して複雑なラムダ式を構築しようとしています。また、モデルから一部のデータをフェッチすることは、ビューの責任ではありません。ビューに適切なビューモデルを設定し、それを使用するために渡すのは、コントローラーの責任です。

したがって、ビューの要件を反映した実際のビュー モデルを使用することをお勧めします。

public class UserViewModel
{
    public int TrainingEventId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string JobDescription { get; set; }
}

public class RegistrationViewModel
{
    public IList<UserViewModel> Users { get; set; }
    public IEnumerable<SelectListItem> TrainingEvents { get; set; }
}

コントローラーアクションに入力されます:

public ActionResult Dealership(int id)
{
    var users = repository
        .Find
        .Where(u => u.Dealer.DealerId == id)
        .OrderBy(u => u.LastName)
        .Select(u => new UserViewModel
        {
            TrainingEventId = u.TrainingEvent.TrainingEventId,
            FirstName = u.FirstName,
            LastName = u.LastName,
            JobDescription = u.JobDescription
        })
        .ToList();

    var trainingEvents = repository
        .TrainingEvents
        .ToList()
        .Select(x => new SelectListItem
        {
            Text = x.Date.ToString() + " - " + x.LocationName,
            Value = x.TrainingEventId.ToString()
        });

    var model = new RegistrationViewModel
    {
        TrainingEventIds = TrainingEventIds,
        TrainingEvents = trainingEvents
    };

    return View("East", model);
}

DropDownListFor最後に、ビューでヘルパーをビュー モデルの対応する値にバインドします。

@for(var i = 0 ; i < Model.TrainingEventIds; i++)
{
    <tr>
        <td>@Html.DisplayFor(m => m.Users[i].LastName)</td>
        <td>@Html.DisplayFor(m => m.Users[i].FirstName)</td>
        <td>@Html.DisplayFor(m => m.Users[i].JobDescription)</td>
        <td>
            @Html.DropDownListFor(
                m => m.Users[i].TrainingEventId, 
                Model.TrainingEvents
            )
        </td>
    </tr>
}
于 2012-11-04T13:47:03.083 に答える