2009-04-21 2 views
1

다른 컨트롤러가 상속하는 기본 컨트롤러 추상 클래스가 있습니다. 이 클래스는 마스터 페이지에 대한 버튼을 만들기 위해 로컬 XML 파일을로드해야합니다. 이 단계에서 ControllerContext가 null이라는 것을 감안할 때 파일을로드하는 가장 좋은 방법은 무엇입니까?ASP.Net에서 ControllerContext가 null 일 때 모델에서 xml 파일을로드하는 방법 MVC

현재 코드입니다 (: 'C \는 inetsrv를이 \ XML을 \ Buttons.xml 내용 \ \ system32를 \ WINDOWS'경로의 일부를 찾을 수 없습니다.는 웹 서버에서 실행하면, 나는 다음과 같은 오류가 발생합니다)

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

문서는 실제로 Model 클래스에서로드되지만 간결하게하기 위해이 글을 남겨 두었습니다.

부작용으로 Content 또는 App_Data에 xml 파일을 넣으시겠습니까?

답변

2

생성자에서 호출하지 마십시오. Initialize 메서드를 재정의합니다. ControllerContext는 null 이외의 값이됩니다. 또는 지연 인스턴스화를 사용하십시오.

1

초기화를 대체하는 대신 가장 좋은 방법이라고 생각합니다.

Server.MapPath를 사용하여 문서 루트의 경로를 확인합니다. 또한 원시 파일을 다운로드 할 수 없도록 App_Data를 사용합니다.

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

** 편집 : ** 귀하의 의견에 따라, 당신은 HttpContext.Current에서 서버 개체를 참조 할 수 또는 다른 사람이 언급 한대로 초기화 방법으로 XML의 로딩을 이동합니다. 나는 후자를 추천하지만, 대안으로 내 대답을 업데이트 할 것이다.

+1

서버 오브젝트가 널 (NULL)입니다. 아마도 이것이 기본 제어기의 생성자에 있기 때문입니다. – darasd

3

저는 여러분의 문제에 대한 해결책이 사람들이 여기서 언급 한 것의 조합이라고 생각합니다. Override XML 문서를 초기화하고 거기에로드하십시오. Server 속성은 그 시점에서 유효해야합니다. 또한 Server.MapPath을 사용하여 웹 사이트 디렉터리 계층 구조에서 리소스를 검색하십시오.

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

또한,는 Server.MapPath를 호출 할 때 (즉, "~"~ 문자와 경로를 시작) 리소스에 응용 프로그램 루트 경로를 사용할 수 있습니다 -이 오류를보고하고있는 이유는 'c : \ windows \ system32 \ inetsrv \ Content \ Xml \ Buttons.xml'경로의 일부를 찾을 수 없습니다.

Server.MapPath를 사용하지 않으면 모든 상대 파일 시스템 경로가 실행 프로세스 (이 경우 IIS)에 상대적입니다. Server.MapPath를 호출하면 웹 사이트의 가상 디렉터리 계층에 상대적인 것으로 지정한 리소스가 실제 파일 시스템 경로로 변환됩니다.

XML 파일의 위치와 관련하여 중요한 문제인 경우 요청시 해당 폴더에 저장된 파일이 제공되지 않으므로 App_Data가 사용되는 것이 좋습니다.