传递给视图的强类型模型作为对象处理。为什么?

时间:2010-09-02 16:45:40

标签: asp.net-mvc

我正在接管相当大的ASP.NET MVC项目,我只是想让它在我的计算机上运行。它是asp.net MVC 1项目,我将继续使用Visual Studio 2010进行开发。我已经设置了数据库和一切,但是我有一个奇怪的问题,并且不知道为什么会发生:

项目使用强类型视图,但不知何故,所有模型都只是作为普通对象而不是视图中的真实类型(在每个视图中)。我已经尝试了,我可以将模型转换为真实类型(Model as RealType),然后它可以工作,虽然它很难看,我不想在项目的500个地方进行....当我尝试运行应用程序我得到的错误是:

CS1061:'object'不包含'SomeProperty'的定义,也没有扩展方法'SomeProperty'接受'object'类型的第一个参数

对于cource,Model实际上有一个名为SomeProperty的属性,我可以在它投射后访问它....

任何人都知道为什么会这样?

非常感谢您的帮助

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,虽然我不确定我做了什么来修复它,但我可以分享我所做的更改以防其他人遇到同样的问题。我将MVC 1应用程序升级到MVC 3,并且遇到了与原始海报相同的问题。据我所知,web.config是这种情况的罪魁祸首,我所做的更改如下。

从web.config中删除它:

<httpHandlers>
  <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpHandlers>

<handlers>删除<system.webServer>部分。当你完成后,它应该是这样的:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

<runtime>之后添加<system.webServer>元素:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
</runtime>

答案 1 :(得分:0)

在视图的第一行,确保它是强类型的:

<%@ Page Language="C#" 
         MasterPageFile="~/Views/Shared/Site.Master" 
         Inherits="System.Web.Mvc.ViewPage<RealType>" %>

而不是:

<%@ Page Language="C#" 
         MasterPageFile="~/Views/Shared/Site.Master" 
         Inherits="System.Web.Mvc.ViewPage" %>

强类型部分(ascx)也是如此。

答案 2 :(得分:0)

在几乎神经衰弱之后,我终于设法让它发挥作用,但是我仍然不明白究竟是什么问题。我在这里写了一个解决方案,因为它可能对某人有所帮助:所以问题是以某种方式使用Visual Studio 2010和asp.net mvc 1.默认情况下,当你第一次打开它时,VS2010会将mvc1项目更新为mvc 2。所以首先你做的很明显:将Web引用而不是2.0版本更改为1.0版本,也可以在web.config中更改程序集部分的版本。

这里有一个重要的技巧(如果没有它,我的ViewPage.Model不是强类型的,而是一个普通的对象):你还必须在web.config中添加以下内容:

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="2.0.0.0" newVersion="1.0.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>

是的,你说老版本是2而新版本是1(而不只是删除这一部分,就像我先做的那样)。这解决了这个问题......