การใช้ Server.MapPath () ภายในฟิลด์แบบคงที่ใน ASP.NET MVC


116

ฉันกำลังสร้างไซต์ ASP.NET MVC ที่ฉันใช้ Lucene.Net สำหรับการค้นหา ฉันถามคำถามที่นี่เกี่ยวกับวิธีจัดโครงสร้างการใช้งาน Lucene.Net ในแอปพลิเคชัน ASP.NET MVC อย่างถูกต้องและได้รับแจ้งว่าวิธีที่ดีที่สุดคือการประกาศ my IndexWriteras public staticเพื่อให้สามารถใช้ซ้ำได้

นี่คือรหัสบางส่วนที่อยู่ด้านบนของ SearchController ของฉัน:

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

เมื่อwriterเป็นแบบคงที่IndexLocationจะต้องเป็นแบบคงที่ ดังนั้นคอมไพเลอร์จึงให้ข้อผิดพลาดต่อไปนี้สำหรับServer.MapPath():

จำเป็นต้องมีการอ้างอิงออบเจ็กต์สำหรับฟิลด์วิธีหรือคุณสมบัติที่ไม่คงที่ 'System.Web.Mvc.Controller.Server.get'

มีวิธีการใช้ Server.MapPath () หรือสิ่งที่คล้ายกันจากฟิลด์แบบคงที่หรือไม่? ฉันจะแก้ไขข้อผิดพลาดนี้ได้อย่างไร?

คำตอบ:


240

ลองซึ่งเป็นHostingEnvironment.MapPathstatic

ดูคำถาม SO นี้เพื่อยืนยันว่าHostingEnvironment.MapPathส่งคืนค่าเดียวกันกับServer.MapPath: อะไรคือความแตกต่างระหว่าง Server.MapPath และ HostingEnvironment.MapPath?


ฟังก์ชั่นนี้ทำให้ฉันมีข้อผิดพลาดเนื่องจากผลลัพธ์ที่ถูกสร้างใหม่โดย HostingEnvironment MapPath ไม่เหมือนกับ Server.MapPath ฟังก์ชันหลังจะส่งคืน url ที่สมบูรณ์ไม่ใช่ url สัมพัทธ์
John

@ john ฉันได้รับค่าเดียวกันสำหรับทั้งสองอย่าง
ps2goat

45

ฉันคิดว่าคุณสามารถลองใช้วิธีนี้เพื่อโทรเข้าจากชั้นเรียน

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

* ---------------- ขออภัยฉันดูแลสำหรับฟังก์ชั่นคงตอบคำถามแล้วโดย adrift *

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

ปรับปรุง

ฉันได้รับข้อยกเว้นขณะใช้งาน System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

รายละเอียดเช่น System.ArgumentException: ไม่อนุญาตให้ใช้เส้นทางเสมือนสัมพัทธ์ 'SignatureImages' ที่นี่ ที่ System.Web.VirtualPath.FailIfRelativePath ()

โซลูชัน (ทดสอบในวิธีการเว็บแบบคงที่)

System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/"); ทำงาน


1
ครั้งเดียวที่ฉันเห็นข้อผิดพลาดที่คุณกล่าวถึงในการอัปเดตของคุณคือเมื่อรหัสใช้เส้นทางเสมือนสัมพัทธ์ ตัวอย่างเช่นServer.MapPath()อนุญาตเส้นทางของ "files / file1.doc" ใช้บริบทปัจจุบันเพื่อกำหนดเส้นทางของเพจปัจจุบันเช่นจากนั้นสร้างเส้นทางสัมพัทธ์จากที่นั่น ถ้าเราอยู่ใน~/Subfolder/Page1.aspxURL จะ map ~/Subfolder/files/file1.docจาก HostingEnviornment.MapPath()เป็นแบบคงที่และจึงมักจะต้องเส้นทางเสมือนเต็มรูปแบบที่เริ่มต้นด้วย~/ส่วนหนึ่งของ URL
ps2goat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.