ASP.NET MVC不会将aspx页面中的Model对象转换为适当的已发送模型到此页面

时间:2011-11-09 09:27:11

标签: asp.net-mvc-3

EDITED

我有问题。 ASP.NET MVC不会在* .aspx页面中将Model转换为适当的View Model。例如: 我将MyViewModel(带有属性MyProperty)传递给页面(在Controler中的Action中返回View(MyViewModel)),但是在运行时我得到这样的错误。

  

错误CS1061:'object'不包含'MyProperty'的定义,并且没有扩展方法'MyProperty'接受类型'object'的第一个参数可以找到(你是否缺少using指令或汇编引用?)

我的上下文中的对象是aspx页面中的Model对象。

我们正在使用此workround <% var model= Model as MyViewModel; %>。并使用我们应该使用Model的模型。  如何使模型工作?

EDITED

这是最高指令

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/BaseViewMaster.Master" Inherits="System.Web.Mvc.ViewPage<Organization.Core.ViewModels.Models.MyViewModel>" %>

<%@ Import Namespace="Resources" %>
<%@ Import Namespace="Organization.Core.ViewModels.Models" %>

母版页:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<Organization.Core.ViewModels.Models.BaseViewModel>" %>
<%@ Import Namespace="Organization.Core.ViewModels.Models" %>

3 个答案:

答案 0 :(得分:3)

您不应该尝试在视图中投射模型。请使用适当的强类型视图:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>

然后,请在您的视图中查看Model

如果您需要从EF域模型转换为视图模型,请在控制器方法中手动或使用Automapper等方法进行。

答案 1 :(得分:1)

我在将MVC2应用程序转换为MVC4后遇到了同样的问题。我的问题是在 Views文件夹中的Web.config文件中。我创建了一个新的MVC4项目,并在我现有的Views / Web.config之上复制了默认的Views / Web.config,解决了这个问题。

相信问题出现在<pages>节点,其中一些版本号不在4.我猜想pageParserFilterType因为问题的性质,但是我我不确定。在撰写我的特定版本时,这就是页面节点现在的样子,它对我有用:

<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>

答案 2 :(得分:0)

你是非常非常错误的,你不应该将查看强制转换为 ViewModel ,因为它总会返回false,null或抛出异常。

在相关示例中,例如在任何典型的M-V-VM相关项目中,与Model,View和ViewModel相关的类都是协方差的......

因此,M,V,VM松散耦合,因此没有共同的根类可以被翻译成。

  • class AbstractViewModel - &gt; ... - &gt;您的视图的 ViewModels (UI绑定,行为,数据绑定)
  • class AbstractView - &gt; ... - &gt;您的观看次数(页面,屏幕等);
  • class AbstractModel - &gt; ... - &gt;您的模型(算法,业务层等)

这些层次结构不可能在一个树中,除了对象基类,因为这将破坏松耦合并从模型和视觉设计(视图,控件)中弃用分离表示逻辑(演示者,视图模型)的想法

在大多数DI框架中,依赖项作为公共只读属性注入,因此请尝试查看(取决于MVP,MV-VM,MVC实现),例如((1)dot(2)表示只读在名为(1)的类中的属性(2),其中一些也可能是内部的,因此无法访问:

  • ViewModel.View
  • ViewModel.Model
  • View.ViewModel
  • Model.ViewModel

属性的实际名称可能不同,但逻辑不是。

在您的情况下,您很可能错过了该财产:

<% var model= Model.ViewModel as MyViewModel; %>. 

<% var model= (Model as MyModel).MyViewModel; %>. 

或只是

<% var model= MyModel.MyViewModel; %>. (if you are the  M-V-VM frameworks developer like me)