2011-11-01 69 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”之类的东西将您的领域类映射到视图特定的模型。您也可以创建自己的模型绑定器。 –