2010-09-02 2 views
0

Я занимаюсь довольно большим проектом ASP.NET MVC, и я просто пытаюсь заставить его работать на моем компьютере. Это проект asp.net MVC 1, и я продолжу разработку Visual Studio 2010. Я создал базу данных и все, но у меня есть странная проблема и не знаю, почему это происходит:Сильно типизированная модель, переданная в представление, обрабатывается как объект. Зачем?

Проект использует строго типизированные виды но почему-то все модели просто управляются как простые объекты, а не их реальные типы в представлениях (во всех представлениях). Я попытался, и я могу применить модель к реальному типу (Model as RealType), а затем он работает, хотя он уродлив и я не хочу делать это в 500 местах в проекте .... Когда я пытаюсь запустить приложение ошибка, я получаю это:

CS1061: «объект» не содержит определение для «SomeProperty», а метод расширения «SomeProperty» принимающего первый аргумент типа «объект» может быть найден

из задних Модель действительно имеет свойство SomeProperty, которое я могу получить после того, как я его передал ....

У любого есть идеи, почему это так?

Большое спасибо за любую помощь

ответ

0

После почти нервного срыва мне наконец удалось заставить его работать, но я до сих пор не понимаю, в чем проблема. Я пишу здесь решение, так как это может помочь кому-то. Поэтому проблема заключалась в использовании Visual Studio 2010 с asp.net mvc 1. По умолчанию VS2010 обновляет проект mvc1 до mvc 2, когда вы открываете его в первый раз. Итак, сначала сделайте очевидное: измените веб-ссылку вместо версии 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 (и не просто удалить этот раздел, как я сделал вначале). И это решило проблему ....

+0

Это, вероятно, не лучшее возможное решение. Вот ссылка на официальный документ от Microsoft, в котором объясняется, как это сделать правильно: http: // download. microsoft.com/download/F/1/6/F16F9AF9-8EF4-4845-BC97-639791D5699C –

+0

Восстановит исходный файл web.config после того, как VS преобразует его в работу MVC2? –

+0

Да, я был бы рад услышать лучшее решение Но ссылка, которую вы предложили, как-то сломана ... – apolka

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).

+0

Да, к сожалению, сильно набирается в первой строке взглядов ... Любой другая идея ??? Большое спасибо. – apolka

+0

Где вы снимаете, когда вы нажимаете F12 над свойством «Модель» в представлении? –

+0

Я попал в свойство Model класса ViewPage (в пространстве имен System.Web.Mvc), и это действительно объект .... – apolka

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> 
+0

Этот ответ по-прежнему действителен, даже с newVersion = "4.0.0.0". Очевидно, вы должны сказать Mvc действовать по-старому. Итак, что нового? Как это отличается на моих страницах? – Richard

Смежные вопросы