Comment résoudre un chemin relatif à une racine d’application ASP.NET MVC 4?

Comment résoudre les chemins relatifs au répertoire racine d’une application ASP.NET MVC 4? C’est-à-dire que je veux ouvrir des fichiers appartenant à l’application à partir des actions du contrôleur, référencées comme ~/Data/data.html . Ces chemins sont généralement spécifiés dans Web.config .

MODIFIER:

Par ‘resolve’, je veux transformer un chemin relatif au répertoire racine de l’application en un chemin absolu, .eg ~/Data/data.htmlC:\App\Data\Data.html .

Pour obtenir le chemin absolu, utilisez ceci:

 Ssortingng path = HttpContext.Current.Server.MapPath("~/Data/data.html"); 

MODIFIER:

Pour supprimer le contexte du contrôleur, supprimez .Current de la ligne ci-dessus. En utilisant HttpContext seul, il est plus facile de tester car il est basé sur le contexte du contrôleur donc plus localisé.

Je me rends compte maintenant que je n’aime pas le fonctionnement de Server.MapPath (appelle en interne Server.MapPath interne). Je recommande donc de toujours utiliser HostingEnvironment.MapPath car il est statique et ne dépend pas du contexte, sauf si vous voulez que …

Je trouve ce code utile lorsque j’ai besoin d’un chemin en dehors d’un contrôleur, par exemple lorsque j’initialise des composants dans Global.asax.cs:

 HostingEnvironment.MapPath("~/Data/data.html") 

Utilisez simplement ce qui suit

 Server.MapPath("~/Data/data.html") 

Dans l’action, vous pouvez appeler:

 this.Request.PhysicalPath 

qui renvoie le chemin physique en référence au contrôleur actuel. Si vous avez seulement besoin de l’appel du chemin racine:

 this.Request.PhysicalApplicationPath 

Dans votre contrôleur, utilisez:

 var path = HttpContext.Server.MapPath("~/Data/data.html"); 

Cela vous permet de tester le contrôleur avec Moq comme ceci:

 var querySsortingng = new NameValueCollection(); var mockRequest = new Mock(); mockRequest.Setup(r => r.QuerySsortingng).Returns(querySsortingng); var mockHttpContext = new Mock(); mockHttpContext.Setup(c => c.Request).Returns(mockRequest.Object); var server = new Mock(); server.Setup(m => m.MapPath("~/Data/data.html")).Returns("path/to/test/data"); mockHttpContext.Setup(m => m.Server).Returns(server.Object); var mockControllerContext = new Mock(); mockControllerContext.Setup(c => c.HttpContext).Returns(mockHttpContext.Object); var controller = new MyTestController(); controller.ControllerContext = mockControllerContext.Object;