2015-09-20 30 views
0

我有一个Viewmodel由两个对象组成 - 一个User Object继承自ApplicationUser,它构建在通常的ASP.Net Identityframework和Placement对象上。ASP.NET MVC链接Viewmodel中的两个模型以检索匹配的属性

这两个对象通过Placement对象上的StudentID字符串属性链接,该对象包含对ApplicationUser对象上的StudentID的引用。

两个模型中的相关内容是:

public class ApplicationUser : IdentityUser 
{ 
    public int CountyID { get; set; } 

    public string StudentID { get; set; } 
} 

public class Placement 
{ 
    public int PlacementID { get; set; } 

    [Display(Name = "Student Assigned")] 
    public virtual ApplicationUser User { get; set; } 

    [DisplayFormat(NullDisplayText = "Not Assigned")] 
    public string StudentID { get; set; } 
} 

我有一个视图模型如下哪个环节这两个类:

namespace Placementv2.ViewModels 
{ 
    public class PlacementStudentIndexData 
    { 
     public IEnumerable<ApplicationUser> User { get; set; } 

     public IEnumerable<Placement> Placement { get; set; } 
    } 
} 

我有放置控制器,分配上的指定动作选定的用户到当前活动。 (这是基于一个详细视图针对展示其示出了一个单一的位置和包括可能未分配ApplicationUser对象的模型的动作是如下:

public ActionResult Assign(int PlacementID, string StudentID) 
{ 
    Placement placement = db.Placements.Find(PlacementID); 
    ApplicationUser student = db.Users.Find(StudentID); 

    if (ModelState.IsValid) 
    { 
     placement.Filled = true; 
     placement.StudentID = StudentID; 

     db.SaveChanges(); 

     Placement postedplacement = db.Placements.Find(PlacementID); 
     var studenttoupdate = db.Users.Where(p => p.StudentID == postedplacement.StudentID); 
     studenttoupdate.Single().Placed = true; 
    } 

    db.SaveChanges(); 
    return RedirectToAction("Details", new {ID = placement.PlacementID}); 
} 

我的问题是,以下的用户分配给一个放置我的展示位置详细信息视图(引用视图模型),我可以检索用户和展示位置的属性,但我不能给特定用户在此基础上加入对StudentID安置结合。

<dd> 
    @if (Model.Placement.FirstOrDefault().Filled == true) 
    { 
     <div class="alert-success"> 
      Assigned to StudentID: @Model.Placement.FirstOrDefault().StudentID 

      @Model.User.Where(f => f.StudentID == @Model.Placement.FirstOrDefault().StudentID).First().SecondName 
     </div> 
    } 
    else 
    { 
     <div class="alert-danger">Not Assigned</div> 
    } 

    @if (Model.Placement.FirstOrDefault().Filled == true) 
    { 
     @Html.ActionLink("Remove Student", "Unassign", "Placements", new { Model.Placement.FirstOrDefault().StudentID, Model.Placement.FirstOrDefault().PlacementID }, new { @class = "btn btn-info" }) 
    } 
</dd> 
<dt> 

@Model。 Placement.FirstOrDefault()。StudentID正常工作它引用了Placement对象,但是@ Model.User.Where(f => f.StudentID == @ Model.Placement.FirstOrDefault()。StudentID).First()。SecondName无法将正确的User实例绑定到检索其他用户属性,如SecondName。我尝试过各种版本,并尝试使用可用的Intellisense选项,但没有成功。

+0

在进一步研究这个时,我想或许两个模型的绑定应该发生在Controller中,而不是在视图中? –

回答

0

这最终为我工作。总之,我必须在控制器中创建第二个用户集合,该用户已预先过滤以匹配当前的展示位置ID。

public ActionResult Details(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var viewModel = new PlacementStudentIndexData(); 
     viewModel.Placement = db.Placements.Where(p => p.PlacementID == id.Value).ToList(); 
     viewModel.UnplacedUser = db.Users.Where(p => p.Placed == false).Where(p => p.PlacementYearID > 0).ToList(); 
     viewModel.PlacedUser = db.Users.Where(u => u.StudentID == db.Placements.Where(p => p.PlacementID == id.Value).FirstOrDefault().StudentID);