ASP.NET MVC - ابحث عن المسار المطلق إلى مجلد App_Data من وحدة التحكم

StackOverflow https://stackoverflow.com/questions/1268738

  •  13-09-2019
  •  | 
  •  

سؤال

ما هي الطريقة الصحيحة للعثور على المسار المطلق إلى مجلد App_Data من وحدة تحكم في مشروع ASP.NET MVC؟ أود أن أكون قادرا على العمل مؤقتا مع ملف .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"

أين يجب أن أحدد مسار ملف .xml في تطبيق MVC؟ global.asax والعصي هو متغير مستوى التطبيق؟

هل كانت مفيدة؟

المحلول

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 طريقة

نصائح أخرى

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

ربما هذا هو الطريقة الأكثر صحة "للحصول عليه.

أحاول الحصول على العادة في استخدام HostingEnvironment بدلا من Server لأنه يعمل في سياق خدمات WCF أيضا.

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

الطريقة الأكثر صحة هي استخدام 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");
    }
}

[1] http://msdn.microsoft.com/en-us/library/ex526337٪28V=VS.100٪29.aspx.

يحتوي Phil Haak على مثال على ما أعتقد أنه أكثر استقرارا قليلا عند التعامل مع فواصل Directory Directory "" مجنون. كما يتعامل بأمان تسلسل المسار. يأتي مجانا في system.io

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

ومع ذلك، يمكنك أيضا تجربة "appdomain.currentdomain.basedirector" بدلا من "server.mappath".

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

أو

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
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);

هذا هو أفضل حل للحصول على المسار ما هو بالضبط الحاجة الآن

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top