MVC 4 @Scripts trên mạng không tồn tại


201

Tôi vừa tạo một dự án ASP.NET MVC 4 và sử dụng Visual Studio 2012 RC để tạo Bộ điều khiển và Chế độ xem Dao động cho IndexCreateHành động.

Khi tôi đến để chạy ứng dụng và duyệt Createxem, lỗi sau đây được hiển thị:

Thông báo lỗi trình biên dịch: CS0103: Tên 'Tập lệnh' không tồn tại trong ngữ cảnh hiện tại

Vấn đề là đoạn mã sau được thêm tự động vào cuối Chế độ xem:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Tại sao tập lệnh không tồn tại?

Tôi đã xem lớp trang Web cơ sở trong hội System.Web.Mvc.dll, v4.0.0.0

Tôi có thể thấy các thuộc tính trợ giúp sau đây có sẵn:

  • Ajax
  • Html
  • Url

Nhưng không có gì có tên là Script.

Có ý kiến ​​gì không?

BIÊN TẬP:

Tệp Web.config của tôi trông như thế này (chưa được chỉnh sửa từ tệp mà Visual Studio đã tạo):

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

EDIT # 2:

Mọi người đang viết blog về việc sử dụng trình @Scriptstrợ giúp:

Chưa cài đặt Visual Studio 2012 RC lên bản cài đặt Windows 8 mới, tôi vẫn không thể sử dụng @Scriptsmặc dù Visual Studio đã thêm nó vào Chế độ xem được tạo!

Các giải pháp được trình bày dưới đây.

Tôi không chắc chắn làm thế nào để đóng cái này, vì cuối cùng một bản cập nhật dường như đã giải quyết vấn đề. Tôi đã kiểm tra lại tôi đã thực hiện cài đặt sạch, sử dụng một dự án mới. Nhưng cùng một dự án thất bại tôi đã làm cho hoạt động tốt sau khi cập nhật khác nhau và không có sự can thiệp rõ ràng thủ công. Cảm ơn tất cả những suy nghĩ nhưng chắc chắn có một vấn đề tại thời điểm đó;)


đã thử thêm vào Web.config? <system.web.webPages.razor> <pages pageBaseType=""> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> etc... </pages>
Zach dev

Tôi đã thêm phần từ Web.config, nhưng tôi không thay đổi bất cứ điều gì trong tệp đó.
FantasticJamieBurns

6
Bạn có nghĩa là tệp "Lượt xem của tôi \ Web.config" không phải là web.config gốc của ứng dụng. Ở mọi mức độ, nó không chính xác và thiếu <add namepace = "System.Web.Optimization" />. Bạn đã cài đặt VS12 Beta trước RC chưa? Phiên bản win8 nào?
RickAndMSFT

@RickAndMSFT Tôi đã thực hiện cài đặt Win8 sạch từ Bản xem trước phát hành ISO, cùng với bản cài đặt từ VS 2012 RC ISO, để đảm bảo chắc chắn rằng đó không phải là xung đột của các phiên bản.
FantasticJamieBurns

@RickAndMSFT Lượt xem của tôi \ Web.config sẽ bỏ lỡ mọi lượt xem trong Khu vực
Maslow

Câu trả lời:


269

Chìa khóa ở đây là thêm

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

vào cả hai tập tin web.config. Kịch bản của tôi là tôi đã có tham chiếu System.Web.Optimization trong cả dự án và web.config chính / root nhưng @Scripts vẫn không hoạt động chính xác. Bạn cần thêm tham chiếu không gian tên vào tệp Views web.config để làm cho nó hoạt động.

CẬP NHẬT:

Kể từ khi phát hành MVC 4 System.Web.Optimization hiện đã lỗi thời. Nếu bạn đang bắt đầu với một giải pháp trống, bạn sẽ cần cài đặt gói nuget sau:

Install-Package Microsoft.AspNet.Web.Optimization

Bạn vẫn sẽ cần tham chiếu System.Web.Optimization trong các tệp web.config. Để biết thêm thông tin xem chủ đề này:

Cách thêm tham chiếu vào System.Web.Optimization cho ứng dụng MVC-3-convert-to-4

Như nhiều người đã chỉ ra, có thể cần phải khởi động lại VS sau các bước trên để thực hiện công việc này.


8
Bạn cũng có thể phải chạy Install-Package Microsoft.AspNet.Web.Optimizationtừ một mẫu ASP.NET MVC4 trống vì nó không được bao gồm theo mặc định.
Portman

@Portman Có thực sự nếu bạn bắt đầu với một mẫu dự án MVC trống, bạn cần cài đặt gói Microsoft.AspNet.Web.Optimization.
Marko

2
Nó chỉ cần được thêm vào web.config trong thư mục Lượt xem cho tôi.
dùng1534664

9
Đây thực sự là giải pháp. Tuy nhiên, tôi cần phải khởi động lại studio hình ảnh để điều này được công nhận.
Jason Eades

4
Tôi đã phải thêm cái này vào Views / Web.config rồi khởi động lại Visual Studio.
Caverman

48

@Styles@Scriptslà 2 người trợ giúp mới được cung cấp bởi System.Web.Optimizationthư viện. Như tên cho thấy, họ gói và thu nhỏ các tệp hoặc tài nguyên CSS và JavaScript tương ứng.

Hãy thử bao gồm không gian tên System.Web.Optimizationbằng @usingchỉ thị hoặc thông quaweb.config

http://ofps.oreilly.com/title/9781449320317/ch_ClientOptimization.html#BundlingAndMinification

CẬP NHẬT

Microsoft đã chuyển gói / thu nhỏ sang một gói riêng gọi là Microsoft.AspNet.Web.Optimization. Bạn có thể tải về lắp ráp từ nuget .

Bài đăng này sẽ hữu ích cho bạn.


2
Thêm System.Web.Optimization cho biết "CS0234: Loại hoặc tên không gian tên 'Tối ưu hóa' không tồn tại trong không gian tên 'System.Web". Không có tham chiếu nào được gọi là System.Web.Optimization để thêm một trong hai.
FantasticJamieBurns

1
Không gian tên System.Web.Optimization đã bị lỗi thời vì điều này đã được trả lời, thay vào đó hãy thử sử dụng Microsoft.AspNet.Web.Optimization. Xem câu hỏi này để biết thêm thông tin: stackoverflow.com/questions/9475893/ Khăn
Jeremy Jarrell 2/213

3
Làm rõ: Không System.Web.Optimizationgian tên KHÔNG bị phản đối, System.Web.Optimization.dlllà.
Despertar

Cảm ơn! Nó hoạt động với tôi khi tôi gặp rắc rối với Bố cục của KHU VỰC khác nhau.
Nhà phát triển

48

Có một bước nhỏ bị thiếu ở trên, mà tôi tìm thấy trên một bài đăng khác. Sau khi thêm

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

đến ~/Views/web.configkhông gian tên của bạn , đóng và mở lại Visual Studio. Đây là những gì tôi đã phải làm để làm việc này.


2
Tương tự ở đây, khởi động lại VS hoạt động nhưng trước đó nó vẫn hiển thị lỗi ...?
Andreas

Đóng VS không cần thiết trong trường hợp của tôi nhưng tôi phải đóng và mở lại chế độ xem .cshtml tôi đang sử dụng
joalcego

29

Tôi đang sử dụng các khu vực và vừa gặp phải vấn đề này, tôi chỉ sao chép các không gian tên từ web.config gốc vào các khu vực web. cấu hình và bây giờ nó hoạt động !!

    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />        
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />

15

Tôi gặp vấn đề tương tự và tôi đã sử dụng WinMerge để giúp tôi theo dõi vấn đề này. Nhưng khi tôi nghiên cứu nó nhiều hơn, tôi thấy rằng Rick có bài đăng blog hoàn hảo cho nó.

Tóm lược:

  • Thêm <add namespace="System.Web.Optimization"/>vào cả hai tệp web.config
  • Chạy Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization
  • Cập nhật mã gói
  • Cập nhật tập tin bố trí
  • Bước cuối cùng là cập nhật 10 thư viện khác. Tôi đã không và nó hoạt động tốt. Vì vậy, có vẻ như bạn có thể trì hoãn điều này (trừ khi tôi đã cập nhật 1 hoặc nhiều trong số họ). :)

Cảm ơn đã trả lời Dan này! (Và chỉ ra blog của tôi). Câu hỏi của anh ta ngụ ý rằng anh ta bắt đầu với RC, nhưng tôi nghĩ bạn đã đúng. Anh ta chỉ cần thêm một bộ điều khiển với RC vào một dự án Beta.
RickAndMSFT

Đã được một vài tuần và cả hai bạn chắc chắn có tôi đoán lần thứ hai. Tôi chắc chắn đã đưa VS 2012 lên máy tính bảng của mình, thứ chưa bao giờ có gì ngoài Ứng dụng Metro và thấy nó thất bại. Tôi sẽ thử lại trong một VM.
FantasticJamieBurns

Điều này làm việc cho tôi. Đọc bài viết được liên kết để được hướng dẫn chính xác về những gì bạn cần làm.
Justin

11

Tôi gặp vấn đề tương tự:

Phiên bản System.Web.Optimization mà tôi đang sử dụng đã lỗi thời đối với MVC4 RC.

Tôi đã cập nhật các gói của mình bằng trình quản lý gói trong VS 2010.

Trong blog MSDN này , ông Andy nói về cách cập nhật dự án MVC 4 Beta của bạn lên MVC 4 RC. Cập nhật các gói của tôi có các Tập lệnh (đặc biệt là gói tối ưu hóa web) để giải quyết cho tôi:

Để cài đặt gói System.Web.Optimization mới nhất, hãy sử dụng Bảng điều khiển quản lý gói (Công cụ -> Trình quản lý gói thư viện -> Bảng điều khiển quản lý gói) và chạy lệnh bên dưới:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization

Sử dụng tệp System.Web.Optimization có trong gói trong tài liệu tham khảo của bạn.

Để cập nhật các gói khác: Menu Công cụ -> Trình quản lý Gói Thư viện -> Quản lý Gói NuGet cho Giải pháp.


5

Tạo một ứng dụng internet MVC 4 RC mới và chạy nó. Điều hướng đến Đăng nhập sử dụng cùng một mã

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Thứ cho phép Login.cshtml hoạt động là tệp Views \ Web.config (không phải phiên bản gốc của ứng dụng) có chứa

<namespaces>

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

  </namespaces>

Tại sao chế độ xem Tạo của bạn không hoạt động và Đăng nhập là?


Tôi đã không sử dụng Đăng nhập - điều đó có thể đã bị hỏng vào thời điểm đó.
FantasticJamieBurns

5

Nhập System.Web.Optimization trên đầu chế độ xem dao cạo của bạn như sau:

@using System.Web.Optimization

3

Tôi gặp vấn đề này, tuy nhiên trong khi chạy lệnh:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization 

Tôi đã nhận được tin nhắn khó hiểu (phải yêu một cách chơi chữ tuyệt vời trước tách cà phê đầu tiên):

Cài đặt-Gói: Thuật toán mã hóa được chỉ định không được hỗ trợ trên nền tảng này.

Tôi đang chạy cái này trên Windows XP SP3 (không phải do lựa chọn) và điều tôi nhận thấy là tôi phải làm theo hướng dẫn được đăng bởi người dùng artnob trên Diễn đàn ASP.NET

  • Vui lòng gỡ cài đặt Nuget và thử cài đặt lại. Nếu bạn không thể làm điều này, hãy đăng nhập với tư cách Quản trị viên.
  • Chuyển đến Công cụ => Trình quản lý tiện ích mở rộng => Chọn "Trình quản lý gói Nuget" => Hủy cài đặt
  • Cài đặt lại, bằng cách tìm kiếm "Nuget" => Cài đặt.
  • Nếu nó không hoạt động, vui lòng thử cài đặt, phiên bản 1.7.x như tôi đã đề cập trong bài viết trước (Điều đó không có nghĩa là bạn phải sử dụng phiên bản trước, nếu nó hoạt động tốt, chúng tôi có thể báo cáo lỗi này và nhận lỗi bản vá cho phiên bản mới nhất).

Khi tôi chạy nó, sau đó tôi có thể chạy dòng lệnh để cập nhật Web.Optimization.

Hy vọng điều này sẽ cứu ai đó một số đào.


2

Chỉ viết

@section Scripts{
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/jqueryval")"></script>
}

@archil Cảm ơn bạn đã thay thế - đó sẽ là một giải pháp tạm thời tốt. Nhưng câu hỏi chính là "Tại sao Sc Script không tồn tại?"
FantasticJamieBurns

@Jamie có nên tồn tại? Ý tôi là, theo như tôi nhớ, không có người trợ giúp Scipts ngoài kia. Có lẽ bạn đang cố gắng sử dụng một số người trợ giúp bên thứ ba?
Archil

1
Tôi đã không tự thêm mã đó - Visual Studio 2012 RC đã thêm nó khi nó tạo Chế độ xem cho Tạo hành động của tôi. Tôi nghĩ bằng cách nào đó MVC 4 của tôi không phải là một cái đúng. Nó phải hoạt động ở đâu đó vì Scott Hanselman đề cập đến cú pháp thất bại như là một bổ sung mới cho MVC 4 RC: hanselman.com/blog/ Kẻ
FantasticJamieBurns

1

Tôi đã nâng cấp từ Beta lên RC và không gặp phải vấn đề 'Tập lệnh'. Lướt trên tất cả các trang web và giải pháp cuối cùng là những gì N40JPJ đã nói cộng với một cách giải quyết khác:

Sao chép phần sau trong View \ Web.config:

  <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="System.Web.Optimization"/>
    <add namespace="System.Web.Helpers"/>
  </namespaces>

và các mục bên trong View \ Shared_Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

Hy vọng nó giúp.


1
Không cần sử dụng if (IsSectionDefined())trừ khi bạn cung cấp một elseđiều khoản. Thực tế là bạn đang nói required: falseđã cho phép phần đó không được xác định, và trong trường hợp đó, phần đó sẽ bị bỏ qua. Vì vậy, đây là mã bổ sung không cần thiết.
ErikE

0

Rõ ràng bạn đã tạo một loại dự án 'Rỗng' mà không có thư mục 'Tập lệnh'. Lời khuyên của tôi - tạo ra loại dự án 'Cơ bản' với thư mục 'Tập lệnh' đầy đủ.

Đối với tất cả các nhà phát triển.


0

chỉ cần xóa / ẩn mã khỏi chế độ tạo & Chỉnh sửa dao cạo của bộ điều khiển của bạn.

 @section Scripts {  

   @Scripts.Render("~/bundles/jqueryval")  
 }  

0
  1. : xóa trang xem.
  2. : thêm không gian tên webconfig (trong thư mục xem)
  3. : tạo xem thử!

chúc may mắn...


0

Thêm một lần nữa cho nhóm - dành nhiều thời gian cố gắng giải quyết cùng một vấn đề - mặc dù nó đã được xác định trong web.config cho root và gốc của Lượt xem. Hóa ra tôi đã thêm nhầm vào phần tử <system.web><pages><namespaces>chứ không phải <system.web**.webPages.razor**><pages><namespaces>phần tử.

Thực sự dễ bỏ lỡ điều đó!


0

Khi tôi nhập vào một trang có mã này:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Lỗi này xảy ra: Lỗi. Đã xảy ra lỗi trong khi xử lý yêu cầu của bạn.

Và ngoại lệ này được ghi lại trong nhật ký của tôi:

System.Web.HttpException (0x80004005): The controller for path '/bundles/jqueryval' was not found or does not implement IController.
   em System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
...

Tôi đã thử tất cả các mẹo trên trang này và không ai trong số họ giải quyết cho tôi. Vì vậy, tôi đã xem thư mục Gói của mình và nhận thấy rằng tôi có hai phiên bản cho System.Web.Optmization.dll:

  • Microsoft.AspNet.Web.Optimization.1.1.0 (v1.1.30515.0 - 68,7KB)
  • Microsoft.Web.Optimization.1.0.0-beta (v1.0.0.0 - 304KB)

Dự án của tôi đã được tham khảo phiên bản beta cũ hơn. Tôi chỉ thay đổi tham chiếu sang phiên bản mới hơn (69KB) và eveything hoạt động tốt.

Tôi nghĩ rằng nó có thể giúp một ai đó.


0

Đó là một giải pháp rõ ràng. Tôi đã có cùng một vấn đề sau đó. Không liên quan đến Tài liệu tham khảo hội hoặc .... Nó sẽ xảy ra trong cách gọi phân cấp của các chế độ xem một phần của MVC, khi bạn có các cấu trúc trang phức tạp. Vì vậy, gọi / hiển thị từng phần riêng biệt trên mỗi trang (có thể là trang chính hoặc một phần) sẽ khiến không thấy các phần bắt buộc của trang như mã dưới đây:

@RenderSection("Scripts", required: false)

Điều đó chỉ đơn giản là buộc trang phải tìm và hiển thị phần liên quan và trong trường hợp thất bại sẽ hiển thị cho bạn một thông báo lỗi như bạn.

Vì vậy, tôi khuyên bạn nên theo dõi các trang của mình (như theo dõi chương trình) từ chủ đến tất cả các phần của nó để Phát hiện sự phụ thuộc . Có thể nó là một công việc khủng khiếp, nhưng không có lựa chọn nào khác ở đây.

Không phải theo kinh nghiệm của tôi, một số tình huống có điều kiện trong lập trình khiến cho bạn không thấy đúng lỗi gây ra sự cố.


0

Tôi gặp vấn đề này sau khi tôi thêm Khu vực vào dự án không có. Để loại bỏ nó, chỉ cần sao chép thư mục web.config với thư mục Lượt xem gốc vào thư mục Lượt xem của khu vực và nó bắt đầu hoạt động.


0

Tôi giải quyết vấn đề này trong MvcMusicStore bằng cách thêm phần mã này vào _Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

và xóa mã này khỏi Edit.cshtml

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Chạy chương trình inshallah sẽ làm việc với bạn.


0

Đối với tôi điều này đã giải quyết vấn đề, trong bảng điều khiển trình quản lý gói NuGet viết như sau:

update-package microsoft.aspnet.mvc -reinstall

0

Khi tôi bắt đầu sử dụng MVC4 gần đây, tôi đã gặp phải vấn đề trên trong khi tạo một dự án với các mẫu trống. Các bước khắc phục sự cố.

  1. Goto TOOLS-> Library Package Manager-> Packager Manager Console Dán lệnh bên dưới và nhấn Enter Install-Package Microsoft.AspNet.Web.Optimization Lưu ý: chờ cài đặt thành công.
  2. Goto Web.Config tệp ở cấp gốc và thêm không gian tên bên dưới trong phần không gian tên trang. thêm vào<namespace="System.Web.Optimization" />
  3. Goto Web.Config trong thư mục Lượt xem và làm theo bước 2.
  4. Xây dựng giải pháp và chạy.

Gói được đề cập trong bước 1 sẽ thêm một vài thư viện hệ thống vào các tham chiếu giải pháp như System.Web.Optimization không phải là tham chiếu mặc định cho các mẫu trống trong MVC4.

Tôi hi vọng cái này giúp được. Cảm ơn bạn


0

Tôi đã gặp một lỗi rất giống khi nâng cấp một dự án từ MVC3 lên MVC4.

Thông báo lỗi trình biên dịch: CS0103: Tên [blah] không tồn tại trong ngữ cảnh hiện tại

Trong trường hợp của tôi, tôi đã có số phiên bản lỗi thời trong một số Web.Configs của mình.

  1. Tôi cần cập nhật số phiên bản System.Web.Mvc từ "3.0.0.0" thành "4.0.0.0" trong mỗi Web.Config trong dự án của tôi.
  2. Tôi cần cập nhật tất cả các số phiên bản System.Web.WebPages, System.Web.Helpers và System.Web.Razor từ "1.0.0.0" thành "2.0.0.0" trong mỗi Web.Config trong dự án của tôi.

Ví dụ:

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

...

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

Hãy chắc chắn xem lại Web.Configs trong mỗi thư mục Lượt xem của bạn.

Bạn có thể đọc thêm về Nâng cấp Dự án ASP.NET MVC 3 lên ASP.NET MVC 4 .


0

Nếu bạn đã thêm vào web.config và nó vẫn hiển thị thông báo, thì bạn cần đóng dự án của mình và mở lại, bây giờ nó sẽ tồn tại và @ Styles.Render ("") và @ Sc scripts.Render () sẽ hoạt động tốt.


-1

Thử cái này:

@section Scripts 
{
    Scripts.Render("~/bundles/jqueryval")  // <- without ampersand at the begin
}
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.