2011-11-01 78 views
7

我被這個問題困住了,我不確定這是否是我對MVC框架,.NET框架或什麼的理解不夠。但是,在這裏可以看到來自任何角落的一些解釋。模型綁定找不到的繼承接口屬性

我在做什麼:使用ASP.NET MVC3模型綁定在視圖中呈現HTML控件。具體來說,我試圖綁定到一個接口而不是一個具體的類。

錯誤:一個ArgumentException「無法找到屬性[blah]。」在頁面加載期間拋出。

代碼:

Interface IFoundation 
{ 
    int Id { get; set; } 
} 

Interface IChild: IFoundation 
{ 
    string Name { get; set; } 
} 

Class Concrete: IChild 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
} 

的觀點:

@model IChild 
@Html.EditorFor(x => x.Id) 

當我嘗試加載的觀點,一個ArgumentException從呼叫指出Id屬性不能被拋向EditorFor()找到。但是,如果我反而綁定到具體類,綁定工作正常。

所以沒有人知道爲什麼EditorFor()將無法解析基接口的繼承屬性?

+0

嘗試使用抽象類。 – wnascimento

+1

這就是我開始做的:編寫實現我的接口的抽象類。然後我的具體類可以繼承和重寫摘要,並且(當前)我也有我的視圖綁定到摘要。不知道綁定到抽象基類是否會對長期運行的視圖起作用 - 下面的Kaleb建議爲綁定實現ViewModel類。我現在不願意開始這條路,但我最終可能會在那裏結束。 –

+0

Kaleb的建議非常好,Automapper/ViewModels是一個不錯的選擇。 – wnascimento

回答

8

在基地/抽象和具體類,屬性,方法等存在。另一方面,接口被實現。 CLR強加的規則。

看到這篇文章解釋ModelBinding和關於這種差異(類x接口)。

http://bradwilson.typepad.com/blog/2011/08/interface-attributes-class-attributes.html

我認爲這是你的答案。

+1

謝謝,這爲我解決了。 '當然,這也引發了一系列問題:我現在要如何管理我的域類以及我的視圖應該綁定哪些類,但這些將成爲未來SO問題的飼料! –

+1

查看[AutoMapper](http://automapper.org/),瞭解您的視圖應該映射到哪些類。快速總結:創建特定於視圖的模型(即視圖模型),並使用諸如「AutoMapper」之類的東西將您的領域類映射到視圖特定的模型。您也可以創建自己的模型綁定器。 –