Menggunakan Server.MapPath () di dalam bidang statis di ASP.NET MVC

116

Saya sedang membangun situs ASP.NET MVC di mana saya menggunakan Lucene.Net untuk kueri penelusuran. Saya mengajukan pertanyaan di sini tentang cara menyusun penggunaan Lucene.Net dengan benar dalam aplikasi ASP.NET MVC dan diberi tahu bahwa metode terbaik adalah dengan mendeklarasikan my IndexWriteras public static, sehingga dapat digunakan kembali.

Berikut beberapa kode yang ada di bagian atas SearchController saya:

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

Seperti writerstatis, IndexLocationjuga harus statis. Jadi, kompilator memberi saya kesalahan berikut untuk Server.MapPath():

Referensi objek diperlukan untuk bidang non-statis, metode, atau properti 'System.Web.Mvc.Controller.Server.get'

Apakah ada cara untuk menggunakan Server.MapPath () atau yang serupa dari bidang statis ? Bagaimana cara memperbaiki kesalahan ini?

Maxim Zaslavsky
sumber

Jawaban:

240

Coba HostingEnvironment.MapPath, yang mana static.

Lihat pertanyaan SO ini untuk konfirmasi yang HostingEnvironment.MapPathmengembalikan nilai yang sama seperti Server.MapPath: Apa perbedaan antara Server.MapPath dan HostingEnvironment.MapPath?

Jeff Ogata
sumber
Fungsi ini memberi saya kesalahan karena hasil returbed oleh HostingEnvironment.MapPath tidak sama dengan Server.MapPath, yang terakhir mengembalikan url absolut bukan url relatif
John
@ John, saya mendapatkan nilai yang sama untuk keduanya.
ps2goat
45

Saya pikir Anda dapat mencoba ini untuk menelepon dari kelas

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

* ---------------- Maaf kekhilafannya, karena fungsi statis sudah menjawab pertanyaan dengan terpaut *

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

Memperbarui

Saya mendapat pengecualian saat menggunakan System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

Rincian ex: System.ArgumentException: Jalur virtual relatif 'SignatureImages' tidak diizinkan di sini. di System.Web.VirtualPath.FailIfRelativePath ()

Solusi (diuji dalam metode web statis)

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

panky sharma
sumber
1
Satu-satunya saat saya melihat kesalahan yang Anda sebutkan dalam pembaruan Anda adalah ketika kode menggunakan jalur virtual relatif. Misalnya, Server.MapPath()memungkinkan jalur "file / file1.doc". Ini menggunakan konteks saat ini untuk menentukan jalur halaman saat ini, misalnya, dan kemudian membuat jalur relatif dari sana. Jika kita masuk ~/Subfolder/Page1.aspx, url akan memetakan dari ~/Subfolder/files/file1.doc. Ini HostingEnviornment.MapPath()statis, dan karenanya selalu membutuhkan jalur virtual lengkap, dimulai dengan ~/bagian url.
ps2goat