2015-06-30 21 views
0

在視圖中呈現來自多個模型的信息的最簡單方法是什麼?我在某些場景中使用ViewModel(特別是當模型不直接相關時),但現在我想爲當前用戶製作一種儀表板。所以除了AspNetUsers模型外,我還有幾個模型(例如Orders,OperationJournal,Jobs等),它們在實體方面都有一個用戶ID上的外鍵。 我做了一個視圖模型,例如:視圖中多個模型的整潔簡單方法

namespace JobShop.Models 
{ 
    class QuickProfileVM 
    { 
     public IEnumerable<Jobs> Jobs { get; set; } 
     public IEnumerable<AspNetUsers> AspNetUsers { get; set; } 
     public IEnumerable<CreditJournal> CreditJournal { get; set; } 
     public IEnumerable<CandidateReview> CandidateReview { get; set; } 
    } 
} 

(因爲我需要的基本模型,由EF完成他們所有實體間的關係左右),但在我看來,這是不夠的。我無法同時查看當前用戶配置文件(如此一條記錄)和詳細信息(多條記錄和多個模型)。 我嘗試使用部分視圖,都使用自己的控制器或使用儀表板視圖控制器中的操作。 作爲一個例子一個ActionResult,現在我玩:

public ActionResult QuickProfile() 
    { 
     var QuickProfile = new QuickProfileVM(); 
     var AspNetUsers = new AspNetUsers(); 

     if (User.Identity.IsAuthenticated) 
     { 
      var CurrentUser = User.Identity.GetUserId();//UserManager.FindById(User.Identity.GetUserId()); 

      var TheUser = db.AspNetUsers.Where(u => u.Id == CurrentUser) 
          .Select(u => new 
          { 
           ID = u.Id, 
           Email = u.Email, 
           PhoneNumber = u.PhoneNumber, 
           Companyname = u.Companyname, 
           Address = u.Address, 
           ZIP = u.ZIP, 
           City = u.City, 
           Country = u.Country, 
           Website = u.Website, 
           Facebook = u.Facebook, 
           Twitter = u.Twitter, 
           GooglePlus = u.GooglePlus, 
           Dribble = u.Dribble, 
           BirthDate = u.BirthDate, 
           Username = u.UserName, 
           Surrname = u.Surname, 
           Name = u.Name, 
           Role = u.Role, 
           ThumbURL = u.ThumbURL, 
           CreditBalance = u.CreditBalance 

          }).Single(); 


      var TheJournal = db.CreditJournal.Where(tj => tj.UseBy == CurrentUser) 
             .Select(tj => new 
             { 
              IdJournal = tj.IdJournal, 
              Operation = tj.Operation, 
              CvID = tj.CvID, 
              JobID = tj.JobID, 
              CreditConsumed = tj.CreditConsumed, 
              UseDate = tj.UseDate, 
              UseBy = tj.UseBy 
             }).ToList(); 
      //similar for Jobs and CandidateReview 
      // 

      var UserId = TheUser.ID; 
      var username = TheUser.Username; 
      var role = TheUser.Role; 
      var InitialCredit = TheUser.CreditBalance; 

      AspNetUsers.UserName = TheUser.Username; 
      AspNetUsers.Companyname = TheUser.Companyname; 
      AspNetUsers.Surname = TheUser.Surrname; 
      AspNetUsers.Name = TheUser.Name; 
      AspNetUsers.ThumbURL = TheUser.ThumbURL; 
      AspNetUsers.CreditBalance = InitialCredit; 

      //I put this to ilustrates what I have accesible for example 
      //about CreditJournal: only methods, not properties 
      QuickProfile.CreditJournal.AsEnumerable(); 

     var id = CurrentUser; 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     AspNetUsers aspNetUsers = db.AspNetUsers.Find(id); 
     if (aspNetUsers == null) 
     { 
      return HttpNotFound(); 
     } 

     } 

     return View(AspNetUsers); 
     //Disbled since at this stage is not usefull 
     //return View(QuickProfile); 
     //return View(); 
    } 
+0

我不認爲問題是那麼清楚,但是在代碼註釋中提到您無法訪問'CreditJournal'屬性,這是因爲'QuickProfile.CreditJournal'引用了多條記錄(它是一個'IEnumerable')你需要在視圖中列舉它們以顯示每個信用日誌/子記錄的屬性 – Charleh

+0

是的,我需要這個,但其中一個(很多錯誤)是CreditJournal(例如)不可枚舉。 – net4u

回答

1

我建議你考慮在視圖中使用Html.RenderAction。例如,假設你的主儀表板是這樣的:

@{ 
    ViewBag.Title = "title"; 
} 

<h2>Multiple Models</h2> 

@{ Html.RenderAction("GetData", "Foo"); } 

您可以使用Html.RenderAction調用FooController.GetData()

public class FooController : Controller 
{ 
    public ActionResult GetData() 
    { 
     var viewModel = new FooViewModel(); 
     viewModel.TimeStamp = DateTime.UtcNow; 

     return View(viewModel); 
    } 
} 

因此而不是一個視圖模型,有很多附加的屬性其他的ViewModels,可以拆分儀表板視圖的呈現。

總的來說,這應該讓你更容易 - 過去我使用過這種方法,並發現它降低了複雜性。

+0

那麼一個控制器,我想渲染的每個實體的ActionResults? – net4u

+0

是的,你當然可以做到這一點。 –

+0

如何在此添加示例代碼的其他消息?! – net4u