2012-11-04 53 views
0

我正在显示用户列表。每个用户记录都有一个TrainingEvent对象属性(来自多个TrainingEvent的选择)。我创建了一个视图模型来包含用户列表和TrainingEvents列表。MVC3 DropDownListFor未选择保存的值

视图模型:

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对象中的值未被选中。任何想法,为什么不呢?

回答

3

您错误地使用了DropDownListFor帮手。这个助手希望作为第一个参数传递一个简单的包含至多成员访问权限的lambda表达式。在你的例子中,你试图使用诸如FirstOrDefault扩展方法之类的东西来构造一些复杂的lambda表达式,这是不受支持的。从模型中获取一些数据也不是视图的责任。这是控制器的响应来填充适当的视图模型视图,并通过它的消费

因此,我建议你使用反映你的观点要求的实景模型:

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