2009-04-21 5 views
1

null ist. Ich habe eine abstrakte abstrakte Klasse, die meine anderen Controller erben. Diese Klasse muss eine lokale XML-Datei laden, um einige Schaltflächen für die Masterseite zu erstellen. In Anbetracht der Tatsache, dass der ControllerContext zu diesem Zeitpunkt null ist, was ist die beste Vorgehensweise beim Laden der Datei? (Wenn auf dem Webserver ausgeführt wird, erhalte ich folgende Fehlermeldung: kann nicht einen Teil des Wegs 'c: \ windows \ system32 \ inetsrv \ Content \ Xml \ Buttons.xml' gefunden.)Wie lade ich eine XML-Datei aus dem Modell, wenn der ControllerContext in ASP.Net MVC

Aktueller Code ist

using System.Web.Mvc; 
using Site1.Models; 

namespace Site1.Controllers 
{ 

    [SkyArts.Models.Master] 
    public abstract class BaseController : Controller 
    { 
     public BaseController() 
     { 
      XDocument buttonsXmlDoc = XDocument.Load("Content/Xml/Buttons.xml"); 
     } 
    } 
} 

Das Dokument wird tatsächlich aus einer Model-Klasse geladen, aber ich habe es der Kürze halber weggelassen.

Als eine Nebenfrage würden Sie XML-Dateien in Content oder in App_Data setzen?

Antwort

2

Nennen Sie es nicht im Konstruktor. Überschreiben Sie die Initialize-Methode. ControllerContext wird dort nicht null sein. Oder benutze faule Instanziierung.

1

Alternative zum Überschreiben Initialisieren, aber ich denke, das ist die beste Methode.

Ich verwende Server.MapPath, um den Pfad zum Dokumentstamm aufzulösen. Ich würde auch App_Data verwenden, damit die Raw-Datei nicht heruntergeladen werden kann.

var buttonsXmlDoc = XDocument.Load(HttpContext 
             .Current 
             .Server 
             .MapPath("~/App_Data/Buttons.xml")); 

** EDIT: ** basierend auf Ihren Kommentar, können Sie den Server-Objekt aus HttpContext.Current oder bewegen, um die Belastung des XML auf die Initialize-Methode Referenz als andere angemerkt haben. Ich empfehle letzteres, aber ich werde meine Antwort mit der ersteren als Alternative aktualisieren.

+1

Server-Objekt ist null, vermutlich weil dies im Konstruktor des Basis-Controllers ist. – darasd

3

Ich denke, die Lösung für Ihr Problem ist eine Kombination aus dem, was die Leute hier erwähnt haben. Override Initialisieren und laden Sie dort Ihr XML-Dokument. Die Server-Eigenschaft sollte zu diesem Zeitpunkt gültig sein. Verwenden Sie außerdem Server.MapPath, um die Ressource aus der Verzeichnishierarchie Ihrer Website abzurufen.

using System.Web.Mvc; 
using Site1.Models; 

namespace Site1.Controllers 
{ 

    [SkyArts.Models.Master] 
    public abstract class BaseController : Controller 
    { 
     protected override void Initialize(RequestContext rc) 
     { 
      base.Initialize(rc); 

      XDocument buttonsXmlDoc = XDocument.Load(
       Server.MapPath("~/Content/Xml/Buttons.xml")); 
     } 
    } 
} 

Zusätzlich ist zu beachten, dass, wenn Server.MapPath Aufruf, verwenden Sie die Anwendung verwurzelt Pfad zur Ressource (dh den Pfad mit der Tilde beginnen „~“) - das ist der Grund, warum Sie den Fehler zu sehen sind Ein Teil des Pfades 'c: \ windows \ system32 \ inetsrv \ Inhalt \ Xml \ Buttons.xml' konnte nicht gefunden werden.

Wenn Sie Server.MapPath nicht verwenden, sind alle relativen Dateisystempfade relativ zum ausführenden Prozess, in diesem Fall IIS. Durch das Aufrufen von Server.MapPath wird die Ressource, die Sie relativ zur virtuellen Verzeichnishierarchie Ihrer Website angegeben haben, in einen physischen Dateisystempfad übersetzt.

Wie für Ihre Seite Problem in Bezug auf den Speicherort der XML-Datei, würde ich empfehlen, dass App_Data verwendet wird, da die Dateien in diesem Ordner nicht auf Anfrage geliefert werden.

Verwandte Themen