0

我有一個三表TaskModels,TaskAssigned和Users(AspNetUsers)。使用任務任務模型,我正在創建新任務,並使用任務分配模型將此任務分配給用戶。一切工作正常,但是當我在圖像中發佈時,我只是將用戶ID和任務ID分配給用戶。但我想看到用戶名稱任務名稱,而不是他們的ID。這是我的代碼和結果img。EntityFramework項目MVC中的多對多關係

public class TaskAssigned 
{ 
    public int Id { get; set; } 
    public int TaskModelId { get; set; } 
    public int UserId { get; set; } 
    public TasksModel TasksModel { get; set; } 
    public ApplicationUser User { get; set; } 
} 


public class TasksModel 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Heading is required")] 
    public string Heading { get; set; } 

    [Required(ErrorMessage = "Content is required")] 
    public string Content { get; set; } 

    [Required(ErrorMessage = "Start Date is required")] 
    [DisplayName(displayName: "Start Date")] 
    public DateTime StartDate { get; set; } 

    [Required(ErrorMessage = "Deadline is required")] 
    [DisplayName(displayName: "Deadline")] 
    public int DeadlineTask { get; set; }   
} 

public class ApplicationUser 
{ 
    public string Name { get; set; } 
    public List<TaskAssigned> TaskAssigneds { get; set; } 
} 

這裏是我的TaskAssignedsController

public class TaskAssignedsController : Controller 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 

    // GET: TaskAssigneds 
    public ActionResult Index() 
    { 
     var list = db.TaskAssigneds.Include(o => o.TasksModel).Include(o => o.User); 

     return View(list.ToList()); 
    } 

    // GET: TaskAssigneds/Create 
    public ActionResult Create() 
    {    
     ViewBag.TaskModelId = new SelectList(db.TasksModels,"Id", "Heading"); 
     ViewBag.UserId = new SelectList(db.Users, "ApplicationUserId", "UserName"); 
     return View(); 
    } 

    // POST: TaskAssigneds/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,TaskModelId,UserId")] TaskAssigned taskAssigned) 
    { 
     if (ModelState.IsValid) 
     { 
      db.TaskAssigneds.Add(taskAssigned); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.TaskModelId = new SelectList(db.TasksModels, "Id", "Heading", taskAssigned.TasksModel.Heading); 
     ViewBag.UserId = new SelectList(db.Users, "ApplicationUserId", "UserName", taskAssigned.User.UserName); 

     return View(taskAssigned); 
    } 

TaskAssigneds index view

And my result

回答

0

更簡單的方法(不推薦)解決的是的,而不是使用這樣的:

@Html.DisplayFor(modelItem => item.TaskModelId) 

@Html.DisplayFor(modelItem => item.UserId) 

使用這樣的:

@Html.DisplayFor(modelItem => item.TasksModel.Name) 

@Html.DisplayFor(modelItem => item.User.Name) 

然而,這看起來你TasksModel沒有財產。另外,您還應該修復@Html.DisplayNameFor(對於這兩列)。現在


,我的建議是建立一個View Model這樣的:

public class TasksAssignedViewModel 
{ 
    public int TaskModelId { get; set; } 
    public int UserId { get; set; } 
    public int TaskModelName { get; set; } 
    public int UserName { get; set; } 
} 

索引中的作用..then,項目查詢到像這樣的視圖模型:

public ActionResult Index() 
{ 
    var list = db.TaskAssigneds.Select(l => new TasksAssignedViewModel 
     { 
      TaskModelId = l.TasksModel.Id, 
      UserId = l.User.Id, 
      TaskModelName = l.TasksModel.Name, 
      UserName = l.User.Name 
     }); 
    return View(list.ToList()); 
} 

...終於在你的Index.cshtml,你編輯你的模型的類型:

@model IEnumerable<DeadLiner.Models.TasksAssignedViewModel> 

有了這個,就沒有必要再使用Include了。這也使得查詢速度更快,因爲您不再從數據庫獲取所有字段。

+0

我不需要TaskAssigned表嗎?或者我只是添加一個TasksAssignedViewModel? – muradheydarov

+0

@muradheydarov你需要的表。我們只是在'TasksAssignedViewModel'中轉換它。我建議你閱讀[這篇文章](https://stackoverflow.com/questions/10857655/what-does-query-projection-mean-in-entity-framework)瞭解投影如何工作。 – Alisson

+0

我做了你寫的所有內容,但在視圖模型中返回null。我找不到問題在哪裏。我可以在哪裏犯錯誤? – muradheydarov