ASP.NET MVC - नियंत्रक से App_Data फ़ोल्डर में पूर्ण पथ खोजें


283

ASP.NET MVC प्रोजेक्ट में नियंत्रक से App_Data फ़ोल्डर में पूर्ण पथ खोजने का सही तरीका क्या है? मैं अस्थायी रूप से एक .xml फ़ाइल के साथ काम करने में सक्षम होना चाहता हूं और मैं पथ को हार्डकोड नहीं करना चाहता।

यह काम नहीं करता:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");

        //.... do whatever 

        return View();
    }

}

मुझे लगता है कि वेब संदर्भ VirtualPathUtility.ToAbsolute () के बाहर काम नहीं करता है। स्ट्रिंग पथ "C: \ App_Data \ somedata.xml" के रूप में वापस आता है

मुझे MVC ऐप में .xml फ़ाइल का पथ कहाँ निर्धारित करना चाहिए? Global.asax और यह एक अनुप्रयोग-स्तरीय चर छड़ी?


मुझे चिंता और परीक्षण की भावना के एक अलगाव में लगता है - VirtualPathUtility.ToAbsolute () काम नहीं करना चाहिए। लेकिन फिर ऐसा करने का सही तरीका क्या है?
बडीजोई

जवाबों:


398

ASP.NET MVC1 -> MVC3

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");

ASP.NET MVC4

string path = Server.MapPath("~/App_Data/somedata.xml");


MSDN संदर्भ:

HttpServerUtility.MapPath विधि


6
@Cleiton को छोड़कर Url.Content एक URL देता है, सर्वर पथ नहीं।
एंड्रयू डंकमैन

8
mvc4 के लिए यह केवल Server.MapPath ()
SeriousM

6
MVC4 तरीका काम नहीं आया, मुझे या तो उपयोग करना था Currentया Server.MapPath(...)जैसा कि SeriousM ने उल्लेख किया था।
21

27
उपयोगSystem.Web.Hosting.HostingEnvironment.MapPath()
विंस पानुकियो

1
HttpContext.Current को कॉल उन स्थितियों में काम नहीं करता है जहां HttpContext (application_start आदि) नहीं है
mcintyre321

274
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

यह संभवतः इसे प्राप्त करने का एक अधिक "सही" तरीका है।


25
क्योंकि यह "App_Data" स्ट्रिंग को हार्डकोड नहीं कर रहा है। वह भविष्य के संस्करणों में बदल सकता है, या मोनो आदि में भिन्न हो सकता है
एलेक्स

19
इस उत्तर के बारे में अच्छी बात यह है कि मैं अपने मॉडल प्रोजेक्ट में इसका उपयोग बिना रेफरेंसिंग सिस्टम के कर सकता हूं । इस प्रकार, एक साफ जुदाई रखने में मदद करता है। अच्छा है!
Frans

10
ब्लॉग पोस्ट पीट भी इस बारे में बात करता है कि इसका उपयोग करना एक महान विचार क्यों नहीं हो सकता है।
एंडी

13
MSDN में प्रलेखित नहीं है , इसलिए इसका उपयोग नहीं किया जाना चाहिए।
अलेक्जेंडर अब्रामोव

10
"App_Data" के बजाय किसी अन्य स्ट्रिंग को हार्ड-कोड करना एक "सही" तरीका नहीं है। इसके अलावा, .NET कोर में अधिक ऐप डोमेन नहीं हैं।
यूजरकंट्रोल

139

मैं HostingEnvironmentइसके बजाय ServerWCF सेवाओं के संदर्भ में भी काम करने की आदत डालने की कोशिश करता हूं ।

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");

6
Server.MapPath () अंततः HostingEnvironment.MapPath () कहता है, देखें stackoverflow.com/questions/944219/…
टोड

3
यह मेरा पसंदीदा है क्योंकि मैं इसे अपने नियंत्रकों के बाहर उपयोग कर सकता हूं। यह System.Web.Hostingनामस्थान में है जब किसी को प्रासंगिक जानना होगा using। Ref: docs.microsoft.com/en-us/dotnet/api/…
MDMower

7

उपयोग करने के लिए सबसे सही तरीका है HttpContext.Current.Server.MapPath("~/App_Data");। इसका मतलब है कि आप केवल एक विधि से पथ प्राप्त कर सकते हैं जहां HttpContextउपलब्ध है। यह समझ में आता है: App_Data निर्देशिका एक वेब प्रोजेक्ट फ़ोल्डर संरचना है [1]।

यदि आपको एक ऐसे वर्ग से ~ / App_Data के लिए पथ की आवश्यकता है जहां आपके पास पहुंच नहीं है, तो HttpContextआप हमेशा अपने IoC कंटेनर का उपयोग करके एक प्रदाता इंटरफ़ेस को इंजेक्ट कर सकते हैं:

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}

इसे अपने उपयोग से लागू करें HttpApplication:

public class AppDataPathProvider : IAppDataPathProvider
{
    public string GetAppDataPath()
    {
        return MyHttpApplication.GetAppDataPath();
    }
}

जहां MyHttpApplication.GetAppDataPathदिखता है:

public class MyHttpApplication : HttpApplication
{
    // of course you can fetch&store the value at Application_Start
    public static string GetAppDataPath()
    {
        return HttpContext.Current.Server.MapPath("~/App_Data");
    }
}

[१] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx


यदि आप इसका उपयोग कर रहे हैं तो स्थैतिक HttpContext.Currentकभी भी एक जगह पर उपलब्ध नहीं हो सकता है - एक IoC कंटेनर के माध्यम से - दूसरी जगह पर? स्थिर संपत्ति कहाँ उपलब्ध नहीं होगी?
एम। मिंपेन

यह केवल वेब प्रोजेक्ट में उपलब्ध होगा। क्या इससे आपके सवाल का जवाब मिलता है? मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं। आज मुझे लगता है कि मैंने इस (सामान्य रूप से सरल) समस्या को थोड़ा अलग किया है। मैंने शायद एक ही प्रदाता इंटरफ़ेस का उपयोग किया होगा, लेकिन एप्लिकेशन रूट पथ के साथ Application_Start में इसे सेट करें।
डैनियल लिडस्ट्रॉम

नहीं, HttpContext.Current केवल वेब प्रोजेक्ट में उपलब्ध नहीं है ... यदि आप किसी प्रोजेक्ट का संदर्भ लेते हैं जिसमें GetAppDataPath () है, तो इसे हमेशा HttpContext.Current के रूप में भी संदर्भित करना होगा। Ie यदि आप लाइब्रेरी ए का उपयोग करते हैं जो लाइब्रेरी बी का उपयोग करते हैं, तो आपके आवेदन को पुस्तकालय ए और बी के संदर्भ की आवश्यकता होगी ।
एम। मिम्पेन

कभी-कभी अप्रत्यक्ष स्तर के माध्यम से जाने के बजाय, सीधे HttpContext का उपयोग नहीं करना सुविधाजनक होता है। उदाहरण के लिए इकाई परीक्षण सोचें। परीक्षणशीलता आमतौर पर मैं इस तरह से चीजें करता हूं। लेकिन मुझे लगता है कि आप अपने बयान के बारे में गलत हैं। केवल इंटरफ़ेस को असेंबली के बीच साझा करने की आवश्यकता है। यही कारण है कि आप इसे परीक्षण के लिए नकली कर सकते हैं, यानी आपको परीक्षणों के लिए HttpContext.Current की आवश्यकता नहीं है। क्षमा करें, अगर मैं आपके लिए चीजों को भ्रमित कर रहा हूं ...
डैनियल लिडस्ट्रॉम

6

फिल हाक का एक उदाहरण है कि मुझे लगता है कि पागल "\" शैली निर्देशिका विभाजकों के साथ पथ से निपटने पर थोड़ा अधिक स्थिर है। यह सुरक्षित रूप से पथ संघटन को भी संभालता है। यह System.IO में मुफ्त में आता है

var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);

हालाँकि, आप "Server.MapDath" के बजाय "AppDomain.CurrentDomain.BaseDirector" भी आज़मा सकते हैं।


4
string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");

या

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");

1
यद्यपि यह कोड समस्या को हल करने में मदद कर सकता है, क्यों और / या यह सवाल का जवाब देने के बारे में अतिरिक्त संदर्भ प्रदान करता है कि इसकी लंबी अवधि के मूल्य में काफी सुधार होगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें।
o

1
string Index = i;
            string FileName = "Mutton" + Index + ".xml";
            XmlDocument xmlDoc = new XmlDocument();

            var path = Path.Combine(Server.MapPath("~/Content/FilesXML"), FileName);
            xmlDoc.Load(path); // Can use xmlDoc.LoadXml(YourString);

यह रास्ता पाने के लिए सबसे अच्छा समाधान है जो अब के लिए बिल्कुल आवश्यक है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.