2010-09-22 20 views
2

比方說,我們有一個ASP.NET MVC視圖這樣的:動態的MVC視圖具有相似但不相同的類作爲示範

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %> 
<%: Html.EditorFor(model => model.ServiceDate) %> 
<%: Html.ValidationMessageFor(model => model.ServiceDate, "*")%> 

和我們有相似但不完全相同的模型類,例如InvoiceQuote,它們都包含ServiceDate屬性。這兩個類不會從同一個基類繼承,實際上它們目前沒有基類。

  1. 如何讓他們繼承相同的基類,當這兩個由EF生成?如果我能做到這一點,我可以替換dynamic並將基類指定爲View的強類型。

  2. 我當時的印象是,dynamic就是爲此而設計的。但很明顯,這是行不通的,因爲那裏是一個的顯然是未來的LINQ到EF異常:

    CS1963:表達式樹不能包含一個動態操作

雖然在VS 2010編輯器不說,表達式將在運行時解析,但不會,但會失敗。

回答

0

首先,您使用哪個EF版本? 我想你使用EFv1吧?您可以將繼承添加到來自EF的模型中。它們都被框架定義爲民族類別。這意味着您可以創建另一個具有從基類繼承的相同名稱(也是parcial)的類。

順便說一句,我建議你在這種情況下使用ViewModels。爲了重用某些屬性,避免使用繼承,應該使用繼承向類中添加多態行爲。

+0

Downvoted是因爲使用部分類進行擴展不允許在C#中更改基類 - 部分聲明不能指定不同的基類。我在.NET 4和ASP.NET MVC 2中使用EFv4。 – mare 2010-09-22 11:55:30

+1

是的。但是你可以用ServiceDate屬性創建一個接口,並且在你的部分聲明中實現這個接口。這樣做,您可以將界面指定爲View的強類型。對?還是我錯了?我現在不在VS這裏。 – goenning 2010-09-22 12:10:33

+0

這確實有效.. – mare 2010-09-22 12:39:39

0

看起來您正嘗試在視圖中使用由EF生成的類。我會推薦你​​不是這樣做。這就是ViewModel應該做的。不要害怕爲每個視圖創建視圖模型(即使您必須重複某些屬性)並避免傳遞模型。同樣有意見的是強烈鍵入爲<dynamic>就好像你有弱類型的意見。再一次:避免它們:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeAdaptedViewModel>" %> 
<%: Html.EditorFor(model => model.ServiceDate) %> 
<%: Html.ValidationMessageFor(model => model.ServiceDate, "*")%> 
+0

我已經過了這段時間,在某些情況下我會創建自定義模型類。但在這種情況下,沒有必要這樣做,一切都很好,我很好地使用分類來擴展那些EF或添加驗證註釋,所以總的來說它很棒,維護起來很簡單,我不會更改。我意識到它帶來的影響和最佳實踐,應遵循(但不是盲目)。 – mare 2010-09-22 11:22:39

+0

@mare,總是需要使用視圖模型,相信我會讓你的生活更輕鬆。 – 2010-09-22 11:26:33

1

1)實體框架生成的類使用partial關鍵字。這意味着您可以輕鬆擴展它們,而不必擔心代碼生成會消除您的更改。

因此,可以說EF產生:public partial class Customer

你可以做的就是定義另一個叫cs文件Customer_Partial.cs(只是我個人的喜好命名),然後做一些事情,如:

public partial class Customer : IMySharedInterface 
{ 
} 

然後您的查看頁面使用:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IMySharedInterface>" %> 

然後以強類型的方式訪問您的模型屬性。

2)我認爲這是由於你傳遞一個IQueryable到你的視圖。但不知道。有了上述解決方案,您不必擔心。

+0

謝謝,但你真的重複了一切@Guilherme說。 – mare 2010-09-22 15:33:48

+0

@mare,當然,除了代碼示例,接口而不是基類以外,我重複了它,嘗試回答#2,並沒有在你的視圖中使用EF類的手腕。 ;) – jfar 2010-09-22 16:07:01

+0

upvoting但接受​​Guilherme的答案因爲他需要點;) – mare 2010-09-22 16:34:29

相關問題