MVC视图中的动态,具有与模型类似但不相同的类

时间:2010-09-22 10:41:04

标签: asp.net-mvc dynamic

假设我们有一个像这样的ASP.NET MVC视图:

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

我们有类似但不完全相同的Model类,例如InvoiceQuote,它们都包含ServiceDate属性。这两个类不是从同一个基类继承的,实际上它们目前没有基类。

  1. 当EF生成这两个基类时,如何让它们从同一个基类继承?如果我能够这样做,我可以替换dynamic并将基类指定为View的强类型。

  2. 我的印象是dynamic就是为此而建的。但显然它不起作用,因为有一个例外显然是从LINQ到EF:

    CS1963:表达式树可能不包含动态操作

  3. 虽然它确实在VS 2010编辑器中说表达式将在运行时解析,但它不是,但是错误失败。

3 个答案:

答案 0 :(得分:1)

1)Entity Framework生成的类使用partial关键字。这意味着您可以轻松扩展它们,而不必担心代码生成会消除您的更改。

让我们说EF生成:public partial class Customer

你可以做的是定义另一个名为Customer_Partial.cs的.cs文件(只是我个人的命名偏好),然后执行以下操作:

 public partial class Customer : IMySharedInterface
 {  
 }

然后您的视图页面使用:

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

然后以强类型方式访问您的模型属性。

2)我认为这是由您将IQueryable传递到视图中引起的。不过不确定。有了上述解决方案,您就不必担心了。

答案 1 :(得分:0)

您似乎正在尝试在视图中使用EF生成的类。我建议你这样做。这就是ViewModels应该做的事情。不要害怕为每个视图创建视图模型(即使您必须重复某些属性)并避免传递模型。同时拥有强烈键入<dynamic>的视图就好像您有弱类型的视图一样。再一次:避免它们:

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

答案 2 :(得分:0)

首先,您使用的是哪个EF版本? 我想你使用的是EFv1,对吧?您可以为来自EF的模型添加继承。它们都被框架定义为parcial类。这意味着您可以创建另一个具有从基类继承的相同名称(也是parcial)的类。

顺便说一句,我建议你在这种情况下使用ViewModels。避免使用继承只是为了重用某些属性,应该使用继承来为类添加多态行为。