2016-04-03 35 views
-2

嗨是否有可能訪問不同的模型屬性相同的觀點如何在mvc4的相同視圖中訪問不同的模型屬性?可能嗎?

我VisitorsViewModel模式

public DateTime FromDate { get; set; } 
    public DateTime ToDate { get; set; } 

我View_VisitorsForm型號

public System.Guid VisitingID { get; set; } 
    public string Employee { get; set; } 
    public string CustomerName { get; set; } 
    public Nullable<System.DateTime> VisitingDate { get; set; } 
    public string StartTime { get; set; } 
    public string EndTime { get; set; } 
    public string SpendTime { get; set; } 
    public string POVisit { get; set; } 

我想創建5個領域查看FromDateTodate客戶名稱Povisit開始時間結束時間員工。但所有這些領域的屬性在不同的模型中。是否有可能在同一視圖中訪問兩個不同的模型屬性?我試圖根據自己的水平來解釋我的問題。請任何一個給我解決方案。

提前感謝..

+0

一個View應該只有一個ViewModel。 – Ben

+0

mwilczynski我想保持日期和時間作爲文本框,其餘字段需要顯示從Db中獲取的數據,如下圖中提及的[Eg Op] [3] [3]:http:/ /i.stack.imgur.com/YqhGm.jpg所以我必須訪問來自不同模型的屬性。 – Susan

+0

然後創建新的'ViewModel',它結合了來自數據庫的不同模型的屬性。有什麼問題? 'ViewModel'只是這裏的一個輔助工具,用來表示視圖的數據。 – mwilczynski

回答

0

正如mwilczynski所說,一個視圖只有一個視圖模型。作爲模型的想法恰恰包含了視圖呈現頁面所需的數據。理想情況下,沒有更多,也沒有少。

從您的圖像看來,您需要具有數據項集合的視圖模型來呈現網格(訪問日期...下一個約會)。 這是可能的:

public class VisitorsViewModel 
{ 
    public DateTime FromDate { get; set; } 
    public DateTime ToDate { get; set; } 

    public ICollection<VisitViewModel> Visits { get; set; } 
} 

哪裏VisitViewModel是一個包含從數據庫中檢索到的數據在網格中顯示視圖模型:

public class VisitViewModel 
{ 
    public string CustomerName { get; set; } 
    public string PoVisit { get; set; } 
    public string StartTime { get; set; } 
    public string EndTime { get; set; } 
    public string Employee { get; set; } 
} 

控制器看起來是這樣的:

public ActionResult displaycustomer() 
{ 
    // Get data from database 
    List<View_VisitorsForm> objvisitlist = (from v in db.View_VisitorsForm select v).ToList(); 

    // Create a new viewmodel and fill it with the data you want displayed 
    VisitorsViewModel viewmodel = new VisitorsViewModel 
    { 
     FromDate = DateTime.Now.AddDays(-7), //(some default value) 
     ToDate = DateTime.Now,    //(some default value) 
     Visits = new List<VisitViewModel>() 
    }; 

    foreach (View_VisitorsForm visit in objvisitlist) 
    { 
     viewmodel.Visits.Add(new VisitViewModel 
     { 
      CustomerName = visit.CustomerName, 
      PoVisit = visit.POVisit, 
      StartTime = visit.StartTime, 
      EndTime = visit.EndTime, 
      Employee = visit.Employee 
     } 
    } 

    // return a ViewResult with the viewmodel 
    return View(viewmodel); 
} 

在視圖中,您可以像這樣訪問ICollection<VisitViewModel>中的屬性(我假設您希望在表中訪問日期):

<table> 
@foreach (var visit in Model.Visits) 
{ 
    <tr> 
     <td> 
      @Html.DisplayValueFor(m => visit.CustomerName) 
     </td> 
     <td> 
      @Html.DisplayValueFor(m => visit.PoVisit) 
     </td> 
    </tr> 
} 
</table> 
+0

Arnoud這是我的控制器代碼public ActionResult displaycustomer(){List objvisitlist =(from v in db.View_VisitorsForm select v).ToList();返回View();}我在另一個模型中調用一個模型,就像你在答案中提到的一樣,我按照你的說法做了所有事情,但是我得到錯誤。我想在頁面打開時加載數據列表,因此我在控制器中編寫了列表代碼(List ),現在我懷疑哪些對象必須在視圖objvisitlist(控制器對象)或訪問(模型對象)中調用。請澄清這個疑問 – Susan

+0

我看到數據在控制器中被檢索到,但沒有被使用/返回到視圖。我期望創建一個新的viewmodel,並將來自linq結果的數據複製到這個新viewmodel的屬性Visits中。該模型被創建,它應該作爲View方法的參數傳遞給視圖:return View(viewmodel);哦,我不會將實體放入viewmodels。從您的評論我理解View_VisitorsForm不是視圖模型,因爲我以前想過,但是(數據庫)實體,我會嘗試更新我的答案以澄清。 –

0

你應該只創建一個新的視圖模型,如:

public class CombinedVisitorsFormViewModel 
{ 
    public DateTime FromDate { get; set; } 
    public DateTime ToDate { get; set; } 
    public string Employee { get; set; } 
    public string CustomerName { get; set; } 
    public string StartTime { get; set; } 
    public string EndTime { get; set; } 
    public string POVisit { get; set; } 
} 

和鋼絲(或地圖,或者無論你怎麼稱呼它)每個屬性在Controller,該與當前ViewModel一樣。 ViewModel是您的特定視圖/視圖的數據表示,因此它可以合併來自其他模型的數據,甚至根本不與數據庫直接相關的數據。

相關問題