我讀過不少Q &由於MVC架構中的視圖中的邏輯相關,並且在大多數情況下,我同意業務邏輯不應該處於視圖中。儘管如此,我一直質疑我的方法,因爲可輕鬆訪問單個實體可以給我的外鍵關係,從而最終導致我在內部執行Linq to Entities查詢時使用Microsoft的MVC框架與實體框架結合使用視圖。MVC,強類型視圖和實體框架困境
例如:
如果我有以下兩個實體:
產品([PK]產品編號,名稱,金額)
圖像([PK]圖像標識,[FK]的ProductId, ImageTitle,DisplayOrder)
假設我有一個強類型產品的看法,我想顯示主圖像(最低的顯示順序),那麼我會做這樣的事情的觀點:
@{
Image image = (from l in Model.Image
orderby l.DisplayOrder
select l).FirstOrDefault();
}
這是一個用於演示目的的簡單示例,但肯定會開始彎曲與MVC體系結構有關的規則,但另一方面在Controller中執行此操作,然後(禁止天堂)將其阻塞到ViewBag或ViewData肯定會成爲一種犯罪行爲,並且爲管理超過幾個不同的相關類別而痛苦不堪。
我曾經爲複雜的模型創建自定義類,但它很費時,也很難看,因爲實體框架使得將視圖定義爲主模型變得快速和容易(在這種情況下一個產品),然後使用Linq查詢輕鬆檢索產品的所有外圍組件。
我很想知道其他人如何處理這種情況。
編輯:
我也經常做這樣的事情:
@foreach(Image i in Model.Image.OrderBy(e => e.DisplayOrder).ToList())
{
<img ... />
}
你有沒有遇到模型綁定的一些問題?當你在做GET,然後用可能的用戶編輯POST回你的東西時,你需要綁定所有的字段,否則當你將它保存到數據庫時可能會丟失一些數據。還更新了我的答案。 – Bartosz
@Bartosz - 不,我非常非常偶爾地(在5個大型項目中兩次)必須使用綁定排除,但大多數情況下,我可以使用顯示和編輯器模板以及諸如@ Html.EditorFor(model => model .Image.OrderBy(e => e.DisplayOrder)),並且它在發佈到控制器上時非常出色 – Rob
驗證如何?有了Viewmodels,你可以使用MVC驗證註釋,使用EF類,你會用非EF的東西來污染它們。 – Bartosz