我是一名MVC/C#初學者,所以要輕鬆一點。當前記錄沒有元素時,MVC dbContext找到父記錄
我有一個客戶有零個或多個項目的現有數據庫。我從ADODB實體數據模型和dbContext代碼生成器構建了一個ASP.Net項目。
我有一個客戶:Joe Bloggs(ID = 7)。我點擊我的表單中Joe Bloggs的'項目'鏈接查看他的項目。他沒有。我想爲他創建一個項目,所以我在項目控制器上調用Create操作。
我需要李四ID傳遞到創建行動有三個原因(這可能不是必要的 - 請賜教如果需要的話)
因爲這是李四一個項目,我需要將ID = 7傳遞給控制器,以便在爲創建視圖生成模型數據時爲其設置默認客戶ID
當我點擊創建視圖上的取消按鈕時,我想回到最初已過濾的基於Joe博客的項目視圖
當我點擊保存時,我想回到最初過濾的基於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裏面?
據我瞭解,你的模型是類型Customer'的',所以你想有'' – billy