none
關於 VS2013 的 Razor View 的錯誤狀況 RRS feed

  • 問題

  • 你好,我使用的是 VisualStudio 2013 Ultimate 繁體中文版。
    已經更新過 Update3。

    我使用的 Framework 是 .Net Framework 4。

    專案是 ASP.NET MVC 4 Web應用程式 , 範本用的是 空白範本。

    有一個奇怪的狀況是 , 在 Razor View 裡, 只要使用到 Html Helper 的語法
    都會出現如下圖的錯誤情況,也就是這些 Helper 都沒辦法被認得。



    以上面這個例子來說,在 VS2013 裡就會出現 :
    "名稱 ViewBag 不存在於目前內容" 的錯誤訊息, 
    上圖裡的Layout 也是一樣。

    如果重建專案後,直接部署到 IIS 上 , 瀏覽這個頁面就會出現以下錯誤畫面



    有人知道如何解決嗎?

    感謝回覆。
    2014年10月9日 下午 02:18

解答

  • 我剛剛再試了一下,終於發現問題點。

    我的開發環境是建立在 vmware workstation 的虛擬機中,

    原來因為我想要備份方便,在開發環境中我把專案的路徑建立在 vmware 的 host 的一個給開發環境用的目錄裡,然後在開發環境中用網路磁碟機的方式健一個磁碟機代號來放 VisualStudio 專案。

    就是因為這樣把專案放在不是本作業系統磁碟區的路徑會造成 visualstudio 無法對專案裡的套件做 快取;也造成了 VS2013 無法對這個路徑的專案檔做正確的編譯。

    現在我把專案放在 C槽的一個目錄,一切正常。

    連帶前面提到的專案會卡在 加入 Entity Framework 5 的問題也解決了。

    早上忽然想到之前開發 SharePoint Webpart 的時候也有遇過類似的問題,所以就改了一下路徑,還真的解決了。

    現在有一個心得就是,透過 visualstudio 開發專案,專案路徑最好就是建在作業系統的本機磁碟中,可以避免一堆怪怪的問題。

    還是感謝大家的幫忙。

    2014年10月11日 上午 05:37

所有回覆

  • 可能是 Web.config 有遺漏:

    http://demo.tc/Post/684


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年10月10日 上午 12:39
    版主
  • 你好,我的 /Views/Web.config 內容如下:

    <?xml version="1.0" encoding="utf-8"?>
    
    <configuration>
      <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
          <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        </sectionGroup>
      </configSections>
    
      <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
          </namespaces>
        </pages>
      </system.web.webPages.razor>
    
      <appSettings>
        <add key="webpages:Enabled" value="false" />
      </appSettings>
    
      <system.web>
        <httpHandlers>
          <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
        </httpHandlers>
    
        <!--
            在檢視頁面中啟用要求驗證,可能會使驗證發生於
            控制器已經處理輸入之後。根據預設
            MVC 執行要求驗證是在控制器處理輸入之前。
            若要變更此行為,請將 ValidateInputAttribute 套用到
            控制器或動作。
        -->
        <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>
      </system.web>
    
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
    
        <handlers>
          <remove name="BlockViewHandler"/>
          <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
        </handlers>
      </system.webServer>
    </configuration>
    

    專案的命名空間是 MvcApplication2 , 如果依照你提到的網頁中的範例把 <system.web.webPages.razor> 區段改成如下:

     <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
            <add namespace="MvcApplication2.Helper"/>
          </namespaces>
        </pages>
      </system.web.webPages.razor>

    還是會出現原先提到的問題,也就是認不出 Razor Helper 的東西。

    在 網站根目錄下的 Web.config 裡有引用 <add namespace="System.Web.Helpers" /> 的命名空間 , 如果搬到 /Views/Web.config 裡的  <system.web.webPages.razor> 的對應位置 , 也是會出現一樣的問題。

    還是說我有哪個地方沒注意到。

    我目前還沒有用到 Area , 所以我就先照示範網站的前半部去做。

    感謝幫忙。 

    2014年10月10日 上午 02:05
  • 還有一種可能,你有沒有加入 MVC 組件的參考?

    因為空白應用預設並沒有加 MVC 組件的參考,用 NuGet 裝一下就能解決了。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年10月10日 上午 03:50
    版主
  • 您的專案有參考System.Web.Mvc組件嗎? 因為ViewBag是ControllerBase類別的成員
    2014年10月10日 上午 05:13
  • 你好, 我打開方案總管,看起來應當是有加入參考的,畫面如下:

    2014年10月10日 上午 08:26
  • 你好,我看方案總管裡是有的, 有看見 System.Web.Mvc

    我在 VS2010 裡都沒遇到過這樣的問題,  就是在 VS2013 裡有遇到。

    更詭異的是,  當我想用其他的範本去測試,比方說用 [基本] 範本,就會一直卡在 [正在加入 EntityFramework 5.0 ....]

    這一步。真是很傷腦筋。

    用 VS2010 又會有開許多 檔案會有讓 VS2010 無法用鍵盤的特定按鍵的問題(例如:倒退鍵、數字鍵等)

    2014年10月10日 上午 08:31
  • 你要不要修復一下 Visual Studio...

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年10月10日 下午 02:10
    版主
  • 如果停留在 [正在加入 EntityFramework 5.0 ....]這個步驟, 可以檢查看看網路連線是否正常?
    2014年10月11日 上午 12:51
  • 你好,我的環境確定網路正常,因為開空白的 範本可以透過 Nuget 安裝東西。

    也可以瀏覽常去的網站。

    2014年10月11日 上午 04:46
  • 我剛剛再試了一下,終於發現問題點。

    我的開發環境是建立在 vmware workstation 的虛擬機中,

    原來因為我想要備份方便,在開發環境中我把專案的路徑建立在 vmware 的 host 的一個給開發環境用的目錄裡,然後在開發環境中用網路磁碟機的方式健一個磁碟機代號來放 VisualStudio 專案。

    就是因為這樣把專案放在不是本作業系統磁碟區的路徑會造成 visualstudio 無法對專案裡的套件做 快取;也造成了 VS2013 無法對這個路徑的專案檔做正確的編譯。

    現在我把專案放在 C槽的一個目錄,一切正常。

    連帶前面提到的專案會卡在 加入 Entity Framework 5 的問題也解決了。

    早上忽然想到之前開發 SharePoint Webpart 的時候也有遇過類似的問題,所以就改了一下路徑,還真的解決了。

    現在有一個心得就是,透過 visualstudio 開發專案,專案路徑最好就是建在作業系統的本機磁碟中,可以避免一堆怪怪的問題。

    還是感謝大家的幫忙。

    2014年10月11日 上午 05:37
  • 這種不叫怪怪的問題, 而是預設的.NET平台權限管制機制
    2014年10月12日 上午 05:02
  • 今天我也有發現這個情形,我去查到的網路上的資訊為webconfig 移動的時候有缺少引用命名空間

    後來 跟 搬到新資料夾比對的時 也跟 版大比對的時候少了下列這一項命名空間

    加入之後確定可用。大大可以試試看

       <add namespace="System.Web.Optimization"/>

    自己也做一下紀錄

    2015年4月26日 下午 01:50