Tên 'ViewBag' không tồn tại trong ngữ cảnh hiện tại


89

Tôi đang cố gắng sử dụng ViewBag trong ứng dụng của mình, tôi có tất cả các lỗi gần đây, phiên bản mới nhất của MVC 3, nhưng tôi vẫn gặp lỗi:

"Tên 'ViewBag' không tồn tại trong ngữ cảnh hiện tại"

Tôi thậm chí đã gỡ cài đặt và sau đó cài đặt lại MVC 3 nhưng không có thay đổi nào.

Ngoài ra, tôi không tin rằng dll đang hiển thị trong GAC.

Vấn đề của tôi có thể là gì? Hoặc làm cách nào để thêm dll vào GAC?


1
Hãy ghi nhớ, cho 5.2.2.0 web.config phải trỏ đến 5.2.2.0 nhưng Views / web.config để 5.1.0.0 cho MVC lắp ráp
Bart Calixto

Câu trả lời:


39

Bạn cần thêm cấu hình Razor dành riêng cho MVC vào web.config của mình. Xem ở đây: Tiện ích mở rộng Razor HtmlHelper (hoặc không gian tên khác cho chế độ xem) Không tìm thấy

Sử dụng công cụ nâng cấp MVC 3 để tự động đảm bảo bạn có các giá trị cấu hình phù hợp.


Cảm ơn! Liên kết đó đã giúp! Tôi đoán tất cả đây là kết quả của việc tạo một trang web trên MVC 3 Beta, và sau đó khi bạn nhận được phiên bản mới nhất, cấu hình web sẽ không bị thay đổi. Cảm ơn!
efleming

Tôi đã cập nhật bài đăng của mình với điều này cũng như bản sửa lỗi liên quan: stevesmithblog.com/blog/…
ssmith

Bạn có thể sử dụng công cụ nâng cấp (xem câu trả lời cập nhật) để đảm bảo cấu hình của bạn là chính xác.
marcind

3
Chỉ cần lưu ý: nếu bạn có các vị trí xem bổ sung, tức là bên ngoài ~/Viewsvị trí bình thường , hãy sao chép ~/Views/Web.configvào vị trí đó.
dave thieben

83

Tôi đã có cùng một vấn đề. Hóa ra tôi đã thiếu ./Views/Web.configtệp vì tôi đã tạo dự án từ một ứng dụng ASP.NET trống thay vì sử dụng mẫu ASP.NET MVC.

Đối với ASP.NET MVC 5, một ./Views/Web.configtệp vani chứa thông tin sau:

<?xml version="1.0"?>

<!-- https://stackoverflow.com/a/19899269/178082 -->
<configuration>
    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.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=5.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>

        <!--
                Enabling request validation in view pages would cause validation to occur
                after the input has already been processed by the controller. By default
                MVC performs request validation before a controller processes the input.
                To change this behavior apply the ValidateInputAttribute to a
                controller or action.
        -->
        <pages
                validateRequest="false"
                pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <controls>
                <add assembly="System.Web.Mvc, Version=5.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>

Thêm một ./Views/Web.configtệp chứa nội dung này đã khắc phục sự cố này cho tôi.


3
Giải pháp cuối cùng. Tôi đã không triển khai tệp /Views/Web.config tới máy chủ và tệp bị thiếu là nguyên nhân gây ra lỗi.
Stack Man

2
đã quay lại và sử dụng giải pháp này lần thứ 2! :)
user230910

2
Sau khi lãng phí hơn một ngày cố gắng tìm ra nó, điều này đã giúp tôi. Cảm ơn. Chỉ có điều tôi cần thêm vào thẻ <namespaces> trong "./Views/Web.config là; <add namespace="System.Web.Optimization"/>
dunwan

trong trường hợp của tôi, vì lý do nào đó, các phần tử không có trong web.config gốc nhưng được thêm vào web.config trong 'Chế độ xem' khi tôi tạo bố cục MVC5. Tôi đã di chuyển các phần tử sang web.config gốc và xóa 'extra' (??) web.config
JDPeckham

2
Dude, Chúa phù hộ cho bạn vì điều này. Tôi vô cùng khó chịu vì điều này.
Dragan B.

19

Cố gắng làm sạch và xây dựng lại. Nó đã hoạt động trong trường hợp của tôi.


Không thể tin rằng tôi lãng phí thời gian của tôi tự hỏi điều gì đã sai với mã của tôi ... nhờ nó làm việc
Mr_Hmp

tức giận vì điều này hiệu quả ... tôi luôn quên làm điều này và lãng phí quá nhiều thời gian ... không cần thiết
TCC

trong trường hợp của tôi, tôi đã phải xóa các gói thư mục từ dung dịch và làm sạch
Nerdroid

9

Tôi đã gặp sự cố tương tự trong một giải pháp đã được nâng cấp lên MVC 5 trong Visual Studio 2015.

Trong file web.config trong thư mục xem (không phải là web.config root), tôi đã cập nhật số phiên bản đề cập đến trong <configSections>từ 2.0.0.0để 3.0.0.0.

<configuration>
    <configSections>
      <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
        <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      </sectionGroup>
  </configSections>

2
Cảm ơn rât nhiều! Phiên bản này thật là điên rồ. Mỗi khi tôi quay lại, các nâng cấp MS đều thay đổi nhau. Ling to SQL được thay thế bằng Entity Framework, MVC đã chuyển từ 1 lên 6, cứ thế tiếp tục.
JustJohn

Cảm ơn, đã khắc phục sự cố của tôi với VS2017.
QuickNull

Đã sửa ứng dụng mvc 5 VS 2019.
MrDywar

6

Sau khi thử những thứ khác nhau, hóa ra đó là VS cache. Bạn có thể giải quyết bằng cách xóa các tệp bộ đệm ẩn trong:

C: \ Users \ your.name.here \ AppData \ Local \ Microsoft \ VisualStudio \ 14.0 \ ComponentModelCache

Tôi đã đóng dự án của mình, xóa các tệp trên đường dẫn đó và mở lại dự án của mình, xóa giải pháp và xây dựng lại và sự cố đã được giải quyết

Các tệp sẽ được tạo lại khi bạn khởi chạy Visual Studio tiếp theo


Điều này cũng làm việc cho tôi trong v15 (VS 2017). Có lẽ tôi chưa bao giờ nghĩ đến việc này ... cảm ơn vì đã tiết kiệm được nhiều thời gian, Wilson & Silver!
Paul Schroeder

Đường dẫn chung%LOCALAPPDATA%\Microsoft\VisualStudio\14.0\ComponentModelCache
fiat

3

Tôi gặp vấn đề tương tự và crimbo đã cho tôi manh mối phù hợp, nguyên nhân là do tệp ./Views/Web.config có mặt nhưng không chứa đúng không gian tên mà tôi đoán ...

Tôi đã tạo một dự án MVC5 trống và nhập ./Views/Web.config của nó vào dự án hiện có của tôi và các làn sóng màu đỏ trong mỗi lần sử dụng ViewBag đã biến mất!


Visual Studio 2013, đã tạo dự án web trống với hộp MVC được chọn. Nó tạo ra tất cả cấu trúc tệp với tham chiếu không gian tên MVC tối thiểu. Tôi đã thêm một bộ điều khiển và chế độ xem đơn giản. Tôi gặp lỗi biên dịch "Loại hoặc tên không gian tên 'Ajax' không tồn tại trong không gian tên 'System.Web.Mvc' (bạn có thiếu tham chiếu lắp ráp)". File Editor cũng hiển thị cảnh báo "Tên 'ViewBag' không tồn tại trong ngữ cảnh hiện tại". Đi tới Tham chiếu dự án, tìm System.Web.Mvc, đặt bản sao cục bộ thành true. dọn dẹp bản dựng và xây dựng lại, nó đã giải quyết được vấn đề của tôi.
Kagan Agun


2

Tôi đã có một ./Views/Web.Configtệp nhưng lỗi này đã xảy ra sau khi xuất bản trang web. Hóa ra thuộc tính hành động xây dựng trên tệp được đặt thành Nonethay vì Content. Thay đổi điều này để Contentxuất bản được phép hoạt động chính xác.


1

Tôi gặp sự cố này sau khi thay đổi không gian tên Mặc định của Ứng dụng trong hộp thoại Thuộc tính.

./Views/Web.Config chứa tham chiếu đến không gian tên cũ


Có, và nó đưa ra một thông báo lỗi ở vị trí hoàn toàn sai .. cần kiểm tra xem tất cả các không gian tên tồn tại được tham chiếu trong TẤT CẢ các tệp web.config - Tôi đã có một không gian tên cũ trong tệp web / cấu hình của Khu vực gây ra nhiều vấn đề
user230910

1

Trong trường hợp của tôi, việc thay đổi trang web: Phiên bản thành giá trị thích hợp đã giải quyết được vấn đề của tôi, đối với tôi giá trị chính xác là (2.0.0.0 thay vì 3.0.0.0):

<appSettings>
        <add key="webpages:Version" value="2.0.0.0"/>
        <add key="webpages:Enabled" value="false"/>

1

Sau khi thử tất cả các cách tiếp cận, không có cách nào trong số họ hiệu quả với tôi vì tất cả những gì tôi có là cấu hình chính xác. cuối cùng

Xóa tất cả các tệp khỏi "tạm thời" và "% temp%" khỏi hệ thống đã giúp giải quyết vấn đề này.

Mở lệnh Run (Windows + R) và nhập các chuỗi trên và xóa tất cả các tệp tạm thời.


Cảm ơn bạn! Sau khi thử mọi thứ, điều này đã làm việc cho tôi.
user390480

1

Nếu bạn đã thử tất cả các câu trả lời có sẵn mà vẫn không tìm thấy câu trả lời, điều này có thể giải quyết vấn đề. Nếu bạn có các cấu hình giải pháp khác nhau như Gỡ lỗi, Phát hành, v.v. thì hãy đặt đường dẫn đầu ra của dự án thành 'bin' và biên dịch dự án. Hoàn nguyên thay đổi sau khi biên dịch.

Đường dẫn đầu ra của dự án

VS tìm kiếm dlls trong thư mục bin


1

Tôi đã thử xóa tệp bin và obj và khởi động lại VS nhưng không gặp may.

Tôi cũng đã gặp vấn đề này nhiều lần và mỗi lần giải quyết lại là một nỗi đau. Thường thì đó là do tệp web.config không có phiên bản chính xác của một trong các tham chiếu. Điều này có nghĩa là hãy nhấp vào tham chiếu trong Visual Studio để xem phiên bản trong tab thuộc tính, sau đó khớp nó với phiên bản trong tệp web.config.

Một cách khác là (nếu có thể) nâng cấp lên phiên bản mới hơn của khung .net, sau đó xóa các tệp bin / obj và khởi động lại Visual Studio. Tôi chỉ có thể cho rằng nó đang thay đổi điều gì đó trong

Kiểm tra nhanh sự khác biệt giữa tệp csproj thực sự không cho thấy bất kỳ sự khác biệt lớn nào ... Nhưng sự khác biệt mà nó đã cho thấy (tôi đã thêm (xóa) để hiển thị dòng cũ)

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> (remove)
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>(remove)
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>

Trong tệp Web.Config (không phải tệp trong Chế độ xem)

<add key="webpages:Version" value="2.0.0.0" /> (remove)
<add key="webpages:Version" value="3.0.0.0"/>

Nó cũng được thêm (vào cùng một tệp web.config) nhưng tôi đã xóa nó theo cách thủ công

 <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

Cuối cùng, trong Bảng điều khiển Trình quản lý Gói, hãy thêm update-package

Chạy trang web cục bộ và xem bất kỳ lỗi biên dịch nào đã được sửa bởi đoạn thứ hai của tôi (khớp với các phiên bản của tài liệu tham khảo)


0

Tôi đã cập nhật các trang web: Phiên bản trong thư mục ./Views/Web.Config nhưng cài đặt này cũng có trong web.config trong thư mục gốc. Cập nhật cả hai hoặc xóa khỏi web.config gốc


0

Như @Wilson Vallecilla đã đề cập. Vui lòng thực hiện các bước dưới đây để xóa bộ nhớ cache:

Vui lòng làm theo đường dẫn dưới đây để khám phá các tệp:

C:\Users\your.name.here\AppData\Local\Microsoft\VisualStudio\14.0\ComponentModelCache

Xóa tất cả bốn tệp:

  • Microsoft.VisualStudio.Default.cache
  • Microsoft.VisualStudio.Default.catalogs
  • Microsoft.VisualStudio.Default.err
  • Microsoft.VisualStudio.Default.external

Tôi đã đóng dự án của mình, xóa các tệp trên đường dẫn đó và mở lại dự án của mình, xóa giải pháp và xây dựng lại và sự cố đã được giải quyết

Xóa Tệp ASP.NET Tạm thời của bạn cũng hữu ích. C: \ Users \ your.name.here \ AppData \ Local \ Temp \ Temporary ASP.NET Files.

Điều này làm việc cho tôi.

Cảm ơn!


0

Đối với MVC5, trong trường hợp bạn đang xây dựng một ứng dụng từ đầu. Bạn cần thêm tệp web.config vào thư mục Lượt xem và dán mã sau vào đó.

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.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=5.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>
</configuration>

Lưu ý rằng đối với MVC 3, bạn sẽ phải thay đổi phiên bản thành 3.0.0.0 tại

<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

Bạn có thể phải đóng và mở lại trang * .cshtml để xem các thay đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.