Sử dụng Server.MapPath () bên trong trường tĩnh trong ASP.NET MVC


116

Tôi đang xây dựng một trang ASP.NET MVC nơi tôi đang sử dụng Lucene.Net cho các truy vấn tìm kiếm. Tôi đã hỏi một câu hỏi ở đây về cách cấu trúc đúng cách sử dụng Lucene.Net trong ứng dụng ASP.NET MVC và được cho biết rằng phương pháp tốt nhất là khai báo my IndexWriteras public static, để nó có thể được sử dụng lại.

Đây là một số mã nằm ở đầu SearchController của tôi:

public static string IndexLocation = Server.MapPath("~/lucene");
public static Lucene.Net.Analysis.Standard.StandardAnalyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer();
public static IndexWriter writer = new IndexWriter(IndexLocation,analyzer);

Như writerlà tĩnh, IndexLocationcũng phải tĩnh. Do đó, trình biên dịch đang cho tôi lỗi sau vì Server.MapPath():

Một tham chiếu đối tượng là bắt buộc cho trường, phương thức hoặc thuộc tính không tĩnh 'System.Web.Mvc.Controller.Server.get'

cách nào sử dụng Server.MapPath () hoặc thứ gì đó tương tự từ trường tĩnh không? Tôi có thể sửa lỗi này bằng cách nào?

Câu trả lời:


240

Hãy thử HostingEnvironment.MapPath, đó là static.

Xem câu hỏi SO này để biết xác nhận HostingEnvironment.MapPathtrả về cùng giá trị như Server.MapPath: Sự khác biệt giữa Server.MapPath và HostingEnosystem.MapPath là gì?


Chức năng này đã gây ra lỗi cho tôi vì kết quả được trả lại bởi HostingEnosystem.MapPath không giống như Server.MapPath, cái sau trả về một url tuyệt đối không phải là một url tương đối
John

@john, tôi nhận được giá trị như nhau cho cả hai.
ps2goat

45

Tôi nghĩ bạn có thể thử điều này để gọi từ một lớp học

 System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/");

* ---------------- Xin lỗi, tôi giám sát, đối với chức năng tĩnh đã trả lời câu hỏi của adrift *

System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Cập nhật

Tôi có ngoại lệ khi sử dụng System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Chi tiết ví dụ: System.ArgumentException: Đường dẫn ảo tương đối 'SignatureImages' không được phép ở đây. tại System.Web.VirtualPath.FailIfRelativePath ()

Giải pháp (được thử nghiệm trong webmethod tĩnh)

System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/"); Đã làm việc


1
Lần duy nhất tôi thấy lỗi bạn đề cập trong bản cập nhật của mình là khi mã sử dụng một đường dẫn ảo tương đối. Ví dụ: Server.MapPath()cho phép một đường dẫn "tệp / file1.doc". Nó sử dụng ngữ cảnh hiện tại để xác định đường dẫn của trang hiện tại, và sau đó tạo đường dẫn tương đối từ đó. Nếu chúng tôi ở trong ~/Subfolder/Page1.aspx, url sẽ ánh xạ từ ~/Subfolder/files/file1.doc. Là HostingEnviornment.MapPath()tĩnh, và do đó luôn yêu cầu đường dẫn ảo đầy đủ, bắt đầu bằng ~/một phần của url.
ps2goat
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.