Chế độ xem dựa trên dao cạo không thấy các cụm được tham chiếu


101

Tôi đang cố gắng tạo một dạng xem được định kiểu mạnh dựa trên một lớp từ một hội đồng khác. Mặc dù vậy, vì bất kỳ lý do gì, chế độ xem Razor của tôi dường như không có bất kỳ khả năng hiển thị nào của các hội đồng khác được tham chiếu trong dự án của tôi. ví dụ

@model MyClasses.MyModel

dẫn đến lỗi trong Visual Studio 2010, " MyClassesKhông thể tìm thấy tên loại hoặc không gian tên (bạn đang thiếu chỉ thị using hoặc tham chiếu hợp ngữ?)."

Lớp tương tự được tham chiếu trong công cụ chế độ xem tiêu chuẩn hoạt động tốt. Tôi gặp khó khăn tương tự khi cố gắng tham chiếu lớp trong phần nội dung của chế độ xem của tôi.

Tôi thiếu điều gì đó về Razor hay tôi cần tham khảo cách lắp ráp theo cách khác?


Bạn có đang sử dụng toàn bộ không gian tên không? @model namespace.myclasses.mymodel, có lẽ?
Brettski

Câu trả lời:


107

Có một phần cấu hình mới được sử dụng để tham chiếu không gian tên cho các chế độ xem Razor.

Mở web.configtệp trong Viewsthư mục của bạn và đảm bảo tệp có các thông tin sau:

<configuration>
    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.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=3.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="SquishIt.Framework" />
                <add namespace="Your.Namespace.Etc" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>
</configuration>

Ngoài ra, bạn có thể thêm bằng cách sử dụng các câu lệnh vào bố cục được chia sẻ của mình:

@using Your.Namespace.Etc;
<!DOCTYPE html>
<head>
....

Sau khi chỉnh sửa Web.config, hãy khởi động lại Visual Studio để áp dụng các thay đổi.


18
Điều này hoạt động, tuy nhiên hãy đảm bảo rằng các hội đồng của bạn được tham chiếu với Copy Local = true. Các cụm lắp ráp bên ngoài có thể không hoạt động theo cách khác.
Terry

1
Ở đây cần lưu ý rằng nếu bạn đang sử dụng các chế độ xem từ một nguồn "ảo" (chẳng hạn như DB) thay vì sử dụng các tệp chế độ xem thực, bạn phải đặt tệp này vào tệp ROOT web.config để mã trong các chế độ xem hoạt động.
NightOwl888

2
@Terry, có vẻ như Copy local = true là cần thiết ngay cả đối với một số hội đồng có không gian tên miền gốc Hệ thống.
Dan Esparza

2
Các hội đồng của tôi được tải trong thời gian chạy, vì vậy tôi không thể sử dụng tệp web.config để thêm chúng. Có gì khác tôi có thể thử không? Có cách nào để nhập các chế độ xem bên ngoài của tôi với các tệp web.config của riêng chúng không? Nó khá kỳ quặc vì tôi đang tham chiếu đến các không gian tên trong cùng một assembly với các khung nhìn của tôi.
Maksim Vi.

Khởi động lại Visual Studio là không cần thiết. Chỉ cần đóng và mở lại Chế độ xem là đủ.
user247702 09/09

58

Tôi đã gặp vấn đề tương tự: MVC3 Project MyCore.Web đang tham chiếu đến không gian tên MyCore.DBLayer từ một dự án khác trong cùng một giải pháp (với tên lắp ráp MyCoreDBLayer). Tất cả các đối tượng từ MyCore.DBLayer hoạt động hoàn hảo trong Bộ điều khiển và Mô hình nhưng không thành công trong dạng xem Razor với lỗi 'Tên kiểu hoặc vùng tên' DBLayer 'không tồn tại trong vùng tên' MyCore '(bạn thiếu tham chiếu lắp ráp?)' Là rõ ràng không phải như vậy.

  • Tùy chọn Copy Local đã được đặt thành true.
  • Thêm câu lệnh "using ..." trong chế độ xem Razor là vô ích
  • Thêm không gian tên vào phần system.web.webPages.razor cũng vô dụng

Thêm lắp ráp tham chiếu vào phần system.web / compilation / Assembly của tệp web.config gốc đã khắc phục sự cố. Phần bây giờ trông giống như:

<system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        **<add assembly="MyCoreDBLayer" />**
      </assemblies>
    </compilation>
...
</system.web>

Hiện tại, việc bỏ qua phiên bản, văn hóa, mã thông báo là OK, nhưng sẽ được sửa trong tương lai.


Giải pháp này hiệu quả nhưng đó là một ý tưởng tồi. Khi tôi đặt tất cả các lớp của mình vào nội bộ và đặt hội đồng Web làm bạn với MyCoreDBLayer, nó ngừng hoạt động. Tôi đã kết thúc việc viết các lớp công khai dưới dạng mô hình MVC bao quanh các lớp của tôi từ các nhóm bạn bè. Tôi tin rằng người ta không nên sử dụng các lớp khác từ không gian tên mô hình của MVC trong các chế độ xem Razor - luôn có thể viết một trình bao bọc
VB

Điều này đã làm việc cho tôi, tôi đã thử thêm nó vào Views/web.configvà nó hoạt động khi nó cũng được đặt ở đó.
guanome

18

Trong trường hợp của tôi, dự án riêng biệt chứa không gian tên là Ứng dụng bảng điều khiển. Thay đổi nó thành Thư viện lớp đã khắc phục sự cố.


1
Điều này đã giải quyết nó cho tôi. Đầu tiên, tôi đã thử tạo Thư viện lớp (Gói), nhưng gặp sự cố khi tham chiếu đến gói nuget mà tôi cần. Tốt nhất là không được ưa thích và chỉ cần thực hiện một cơ bản Class Library (DLL)
redwards510

15

Không có điều nào ở trên làm việc cho tôi;

  • Dlls đã được đặt thành Sao chép cục bộ
  • Thêm không gian tên vào cả web.configs không làm gì cả
  • Thêm tham chiếu assembly vào system.web \ compilation \ assembly cũng không giúp được gì (mặc dù tôi chưa xóa các tham chiếu này, vì vậy có thể chúng cũng cần thiết)

Nhưng cuối cùng tôi đã tìm thấy một thứ phù hợp với mình:

Đó là vì tôi có Đầu ra bản dựng của mình chuyển đến cấu hình bin \ Debug \ for Debug và bin \ Release \ for Release. Ngay sau khi tôi thay đổi Cấu hình xây dựng thành "bin \" cho Tất cả các cấu hình (như hình ảnh bên dưới) thì mọi thứ bắt đầu hoạt động như bình thường !!!

Cấu hình xây dựng

Tôi không hiểu tại sao việc tách các bản dựng của bạn thành các thư mục Phát hành và Gỡ lỗi lại khiến cú pháp Razor bị hỏng, nhưng có vẻ như là do một cái gì đó không thể tìm thấy các tập hợp. Đối với tôi, các dự án gặp vấn đề về cú pháp dao cạo thực sự là các dự án 'thư viện dao cạo' của tôi. Chúng được đặt làm Dự án ứng dụng tuy nhiên tôi sử dụng chúng làm thư viện lớp với RazorGenerator để biên dịch các khung nhìn của tôi. Khi tôi thực sự cố gắng chạy trực tiếp một trong những dự án này, nó gây ra lỗi cấu hình sau:

Không thể tải tệp hoặc lắp ráp 'System.Web.Helpers, Phiên bản = 3.0.0.0, Văn hóa = trung lập, PublicKeyToken = 31bf3856ad364e35' hoặc một trong các phụ thuộc của nó. Hệ thống không thể tìm thấy các tập tin được chỉ định.

Điều này dẫn tôi đến việc cố gắng thay đổi Đầu ra bản dựng, vì tôi nhận thấy rằng đối với tất cả các dự án web, Đầu ra bản dựng dường như luôn nằm trực tiếp vào thư mục bin, không giống như mặc định cho các thư viện lớp, có cả thư mục phát hành và gỡ lỗi.


1
Đã xác nhận bằng cách này rằng bạn không cần phải có phần system.web \ compilation \ assembly khi các dlls trực tiếp trong thư mục bin. Điều này có thể quay trở lại chỉ là <compilation debug = "true" targetFramework = "4.5.1" />
Sylvia

2
Chúa ơi! Sau nhiều thời gian tìm kiếm giải pháp, điều này cuối cùng đã giải quyết được các khung nhìn Razor của tôi trong một dự án thư viện lớp !! Cảm ơn bạn rất nhiều.
Hullah

2
Không thể tin được! Tôi đang xây dựng thư viện các chế độ xem lớp của mình vào thư mục của một dự án khác và gặp sự cố này. Đường dẫn xây dựng cần phải là bin \ để điều này hoạt động. Bây giờ sử dụng bài xây dựng xcopy thay thế.
GlacialSpoon ngày

1
Tôi đang sử dụng Razor Engine trong một dự án thư viện lớp và gặp phải vấn đề tương tự. Đặt đường dẫn đầu ra thành "bin \" cũng giải quyết được vấn đề này cho tôi. Giống như GlacialSpoon, tôi sao chép lắp ráp ở bước sau xây dựng vào đúng thư mục đầu ra. Không phải là cách tốt nhất, nhưng ít nhất, Intellisense, các cụm tham chiếu và tô sáng cú pháp hoạt động.
Octoate

Cần lưu ý rằng vấn đề ban đầu xảy ra nếu thư mục đầu ra tùy chỉnh của bạn trỏ đến thư mục mẹ ala '.. \ some \ dir \'. Nhưng nếu bạn thay đổi thư mục đầu ra thành 'some \ dir \' thì mọi thứ vẫn hoạt động tốt. Đây chắc chắn là một trục trặc kỳ quặc trong ma trận.
XDS

7

Có vẻ như bạn đang tìm kiếm câu trả lời này: https://stackoverflow.com/a/4136773/176877

Đó là, mở Views \ Web.Config bên trong (KHÔNG phải là root) và thêm không gian tên bên dưới thẻ Pages:

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory.../>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      ...
      <add namespace="System.Web.Routing" />
      <!-- Your namespace here -->
    </namespaces>

Lưu lại, sau đó đóng và mở lại tệp Razor.

Nếu bạn đang sử dụng Khu vực, bạn sẽ cần thực hiện việc này cho từng Web.Config trong từng Khu vực.

Visual Studio đã trở nên tồi tệ hơn trong những năm qua vì vậy nó có thể yêu cầu đóng tệp Razor đang chạy bản dựng Gỡ lỗi sau đó mở lại tệp Razor hoặc trong trường hợp xấu nhất có thể yêu cầu khởi động lại Visual Studio. Nhưng cuối cùng nó sẽ hiển thị tệp Razor cho bạn như thể mọi thứ trong danh sách không gian tên đó đều nằm trong câu lệnh @using ở đầu tất cả các Chế độ xem của bạn.


4

Trong ASP.NET Core MVC , giải pháp là thêm usingvào _ViewImports.cshtml, thay vì đặt web.config trong thư mục View khi làm việc với ASP.NET MVC 5.

_ViewImports.cshtml

@using mySolution
@using mySolution.ViewModels // <-- Add this, and place your ViewModel (e.g. LoginViewModel) in here.
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Lượt xem

@model LoginViewModel // Add to _ViewImports to make this line work
<div>This is the View for the login screen.</div>

3

Đối với tôi, tôi đang tham khảo một dự án là một ứng dụng console. Nó được thiết lập để xây dựng như một exe (ứng dụng giao diện điều khiển) thay vì thư viện lớp (DLL). Khi tôi thay đổi điều này, tôi có thể thấy các mô hình từ dự án riêng biệt đó không có vấn đề gì.


Cảm ơn @ user1619480, tôi đã gặp sự cố tương tự và trong trường hợp của tôi từ Thư viện lớp .Net Framework, tôi đã thêm bằng cách sử dụng VS 2017 và vì lý do nào đó Loại đầu ra là Ứng dụng bảng điều khiển.
danfer 13/02/19

1

Tôi đã gặp lỗi tương tự khi cố gắng sử dụng các đối tượng Smo trong chế độ xem Razor. Rõ ràng điều này là do Razor không thể tìm thấy các DLL được tham chiếu trong dự án. Tôi đã giải quyết vấn đề này bằng cách đặt "Copy Local" thành true cho tất cả Smo dlls, tuy nhiên có thể có giải pháp tốt hơn (xem liên kết của Czechdude ở trên) Các chỉnh sửa @using và web.config là vô ích vì chúng chỉ cần thiết nếu bạn muốn bỏ qua vùng tên một phần từ tên loại (ví dụ: Máy chủ thay vì Microsoft.SqlServer.Management.Smo.Server)


1

Tôi đã gặp lỗi tương tự sau khi chuyển máy phát triển của mình từ Win7 32bit sang Win7 64bit. Thông báo lỗi:

...\Web\Views\Login.cshtml: ASP.net runtime error: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from System.Web.WebPages.Razor, Version=1.0.0.0 ... Type B originates from ... Version=2.0.0.0

Hóa ra tôi đã có cả hai phiên bản trong GAC. Chế độ xem đã web.configtham chiếu v1 nhưng ứng dụng đang tham chiếu v2. Đã xóa các cụm được tham chiếu và thêm lại v1. trong tổng số System.Web.WebPages.Razor, v.v.


+1 thx đây là điểm cuối cùng của tôi, bây giờ tôi có thể gỡ lỗi asp.net mvc 4 hohoho!
citykid

1

tốt, đối với tôi thì khác. Tôi đã thiếu lắp ráp dự án ứng dụng bảng điều khiển của mình với dự án MVC. Vì vậy, thêm tài liệu tham khảo là không đủ.

điều này có thể giúp ích cho người khác. vào tệp root web.config system.web-> compilation-> thêm tham chiếu dự án của bạn như thế này.

<assemblies> <add assembly="Your.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </assemblies>


1

Tôi cũng gặp vấn đề tương tự, nhưng vấn đề là với khung Target của assembly .

Phiên bản được tham chiếu nằm trong .NET Framework 4.6 nơi dự án đã đặt thành .NET framework 4.5.

Hy vọng điều này sẽ giúp ích cho ai đó đang làm rối tung các khuôn khổ.


1

Tên THƯ MỤC Dự án của bạn phải giống nhau. Nếu tên Dự án hoặc Giải pháp của bạn khác, thì MVC sẽ gây hại cho bạn.

Ví dụ: Nếu bạn tạo một Ứng dụng mới và nó có tên mặc định là Webapplicaiton1, thì vùng tên này sẽ được tạo. Vì vậy, hãy để chúng tôi nói rằng bạn không muốn có không gian tên này, vì vậy từ VS, bạn thay đổi mọi nơi bạn có thể nhìn thấy thành "MyNamespace". Bạn cũng tìm kiếm và thay thế tất cả mã từ "Webapplication1" và thay thế nó bằng "MyNamespace". Điều này cũng thay đổi tệp web.config, vì vậy nó sẽ bao gồm

Bây giờ mọi thứ sẽ hoạt động, ngoại trừ chế độ xem Razor.

RazorViews không thể tìm thấy nó, vì có một số loại phụ thuộc kỳ lạ vào FOLDERNAME của dự án. Đó là thiết kế khủng khiếp.

Tôi đã kiểm tra bán kỹ lưỡng điều này bằng cách sao chép các tệp của mình vào một giải pháp mới và sự khác biệt duy nhất là tên thư mục.


Không thể tin được làm thế nào chế nhạo này là! Tôi đã đổi tên thư mục dự án sang tên bên phải và Mở giải pháp trong tệp văn bản và sửa mô tả thư mục! Nó đã làm việc! Tôi đang sử dụng visual studio 2019
Daniel

0

Thử thêm không gian tên của bạn MyClassesvào web.config dưới

<pages> <namespaces></namespaces> </pages>


0

bao gồm toàn bộ không gian tên

@model namespace.myclasses.mymodel

0

Không có https://stackoverflow.com/a/7597360/808128 nào phù hợp với tôi. Thậm chí "thêm assembly reference vào phần system.web / compilation / assemblyblies của tệp web.config gốc". Vì vậy, hai cách vẫn còn đối với tôi: 1) thêm một lớp bọc công khai cho hợp ngữ của tôi mà mã Razor có thể truy cập vào hợp ngữ này thông qua bọc này; 2) chỉ cần thêm logic hợp ngữ vào một lớp công khai trong cùng một tập hợp có mã của Razor.


0

Ngoài việc thực hiện các thay đổi của web.config cho <assemblies><namespaces>, tôi thấy rằng việc GAC'ing assembly đã tạo ra một sự khác biệt lớn. Bạn có thể áp dụng văn hóa và mã thông báo khóa công khai giống như bất kỳ tổ hợp .NET lõi nào được đăng ký trên toàn cầu.

Một số người có thể rùng mình khi nhắc đến GAC. Nhưng với tư cách là một nhà phát triển BizTalk, tôi đã phát triển để nắm bắt nó.


0

Giải pháp này đã làm việc cho tôi (Thật buồn cười, nhưng hiệu quả)

Tôi đã chỉnh sửa các trang xem và sao chép nội dung và dán vào đó, tôi không thay đổi bất kỳ nội dung nào của các chế độ xem, mà chỉ chỉnh sửa để studio trực quan có thể theo dõi các trang và sau đó mọi thứ bắt đầu hoạt động

Giải pháp - Chỉ cần chỉnh sửa các trang và thay thế bằng các trang tương tự (Làm việc cho tôi)


0

trong các mô hình tên không gian, yourClassModel, thêm công khai trước lớp tên

public class yourClassModel{
    prop
}

0

Trong trường hợp của tôi, gói mà tôi cố gắng sử dụng đang tham chiếu .net standard 2.1 trong khi dự án thư viện lớp dao cạo của tôi được đặt thành 2.0

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.