2012-09-30 105 views
0

我是一名MVC/C#初學者,所以要輕鬆一點。當前記錄沒有元素時,MVC dbContext找到父記錄

我有一個客戶有零個或多個項目的現有數據庫。我從ADODB實體數據模型和dbContext代碼生成器構建了一個ASP.Net項目。

我有一個客戶:Joe Bloggs(ID = 7)。我點擊我的表單中Joe Bloggs的'項目'鏈接查看他的項目。他沒有。我想爲他創建一個項目,所以我在項目控制器上調用Create操作。

我需要李四ID傳遞到創建行動有三個原因(這可能不是必要的 - 請賜教如果需要的話)

  1. 因爲這是李四一個項目,我需要將ID = 7傳遞給控制器​​,以便在爲創建視圖生成模型數據時爲其設置默認客戶ID

  2. 當我點擊創建視圖上的取消按鈕時,我想回到最初已過濾的基於Joe博客的項目視圖

  3. 當我點擊保存時,我想回到最初過濾的基於Joe Bloggs的項目視圖。

無論如何,如果我有一個或多個項目李四然後我就可以使用下面這個怪物的視野內從模型的數據訪問他的ID:

<input type="button" title = "New Project" value="New Project" onclick="location.href='@Url.Action("Create", new { id = Model.First().Customer_ID })'" /> 

這裏是問題:如果他沒有任何項目,Model.First()不返回任何東西,所以我找不到'父'Customer_ID記錄。我使用dbContext生成模型類(這是一個數據優先開發)。有些東西告訴我我可以擴展這些類或創建一個新的類來滿足上述情況。

我目前的解決辦法是使用ViewBag來傳遞各種ID和字符串從觀察者>控制器就像一個燙手的山芋,但是這意味着,如果得到三個深(客戶> Proejct>任務),我想上顯示客戶名稱任務,我已經通過了兩次。它聞起來臭臭的。

我注意到項目索引視圖中的下拉菜單中有客戶。這裏是我的代碼:

@Html.DropDownList("Customer_ID", null, "Select a Customer to Filter", new { @onchange = "this.form.submit();" }) 

我也許能破解它的存在,但我真的希望能夠從中可能是兩個或三個深,在這個下拉相去甚遠類竄動下來

下面是從的DbContext

public partial class Customer 
{ 
    public Customer() 
    { 
     this.Tasks = new HashSet<Task>(); 
     this.CustomerProjects = new HashSet<CustomerProject>(); 
    } 

    public int Customer_ID { get; set; } 
    public string Customer_Name { get; set; } 

    public virtual ICollection<CustomerProject> CustomerProjects { get; set; } 
} 

public partial class CustomerProject 
{ 
    public CustomerProject() 
    { 
     this.Tasks = new HashSet<Task>(); 
     this.CustomerProjectTasks = new HashSet<CustomerProjectTask>(); 
    } 

    public int CustomerProject_ID { get; set; } 
    public int Customer_ID { get; set; } 
    public string Project_Name { get; set; } 

    public virtual ICollection<Task> Tasks { get; set; } 
    public virtual Customer Customer { get; set; } 
    public virtual ICollection<CustomerProjectTask> CustomerProjectTasks { get; set; } 
} 

我敢肯定,有一個顯而易見的解決方案產生的刪節客戶和CustomerProject類,但我的實力是在數據庫和VB6,不C#

在Mystere人的建議我已經建立了一個ViewModel類,但我有一點麻煩:

這是什麼在我的模型類文件(據我所知,這只是一個包裝現有的項目實體):

namespace zzz.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public class ProjectsViewModel 
    { 
     public int Customer_ID { get; set; } 
     public ICollection<CustomerProject> CustomerProjects; 
    } 
} 

這裏的什麼在我的控制器的索引動作(我havejust加我現有的項目收集到的新的ViewModel類):

public ViewResult Index(int pCustomer_ID = 0, string pProjectName_Filter = "") 
    { 

     // Set up drop down 
     ViewBag.Customer_ID = new SelectList(db.Customers.OrderBy(x => x.Customer_Name), "Customer_ID", "Customer_Name"); 
     //ViewBag.Selected_Customer_ID = Customer_ID; 

     // If no parameters entered, show nothing 
     // Otherwise optionally filter each parameter 
     var projects = from p in db.CustomerProjects 
      orderby p.Active, p.Project_Order 
      where 
      (p.Project_Name.Contains(pProjectName_Filter) || pProjectName_Filter.Equals("")) && 
      (p.Customer_ID == pCustomer_ID || pCustomer_ID.Equals(0)) && 
      !(pCustomer_ID.Equals(0) && pProjectName_Filter.Equals("")) 
      select p; 


     var customerprojects = new ProjectsViewModel 
     { 
      Customer_ID = pCustomer_ID, 
      CustomerProjects = projects.ToList() 
     }; 


     return View(customerprojects); 
    } 

下面是從我的觀點摘錄(我曾嘗試遍歷Proje在ViewModel類中的CT採集):

@model IEnumerable<BistechPortal.Models.ProjectsViewModel> 

<table> 
@foreach (var item in Model.CustomerProjects) 
{ 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Project_Name) 
    </td> 
</tr> 
} 
</table> 

當我運行索引操作,就在foreach行我得到:

'System.Collections.Generic.IEnumerable<zzzzPortal.Models.ProjectsViewModel>' does not contain a definition for 'CustomerProjects' " 

請翻譯 - 爲什麼不能找到我的「CustomerProjects」集合在我的ViewModel裏面?

+0

據我瞭解,你的模型是類型Customer'的',所以你想有'' – billy

回答

0

這就是爲什麼你不應該直接將實體對象傳遞給視圖。在大多數情況下,視圖需要比定義的實體提供更多的信息(或不同的信息)。

這就是查看模型存在的原因。您將創建一個包含Customer_ID和項目(以及您需要的任何其他數據)的View Model。然後,即使用戶沒有項目,也可以訪問Customer_ID。

public class ProjectsViewModel { 
    public int Customer_ID {get;set;} 
    public List<CustomerProject> CustomerProjects; 
} 

然後,你將這個新對象到您的視圖。

(由OP :)添加

到這個對象傳遞給你的看法,你需要告訴視圖,它不再接受型CustomerProjects,的數據(這花了三個小時制定出)它不再獲得'可枚舉'的數據。

在你看來變化

@model IEnumerable<Portal.Models.CustomerProjects> 

所以要

@model Portal.Models.ProjectsViewModel 

另外,在你看來,你現在要迭代模型。CustomerProject,所以更改

@foreach (var item in Model) 

@foreach (var item in Model.CustomerProjects) 
+0

確定我在創建View Model但作爲一個行家,我會很感激你們可以給予任何幫助。我已經添加了一些信息到我原來的問題。 –

+0

並思考它可能我應該將整個Customer類添加到視圖方法(因爲我也想這個名字)。然而,這看起來不對,因爲每次我用數據填充新類時,我都會有兩個Customer類的副本 - 基礎Projects類中的一個,以及包裝器模式視圖類中的一個。 另一個'設計'方向是改變Project類的填充方式,以至於即使沒有數據時總會有至少一個虛擬「元素」,所以我可以到達父級。看起來像一個黑客,但我想對此有任何意見。 –

+0

雖然我正在探索問題的範圍,但是我應該將客戶選擇列表也放入此模型視圖中嗎?試圖探索這一層的確切目的。如果它是特定視圖使用的純數據,那麼模型視圖的目的似乎是定義視圖將使用的數據結構,控制器的目的是填充它。 –

相關問題