2010-09-22 51 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

相关问题