다음을 통해 공유


ASP.NET 웹 페이지(Razor) 사이트에 대한 Site-Wide 동작 사용자 지정

Tom FitzMacken

이 문서에서는 ASP.NET 웹 페이지(Razor) 웹 사이트의 페이지에 대한 사이트 쪽 설정을 만드는 방법을 설명합니다.

학습할 내용:

  • 사이트의 모든 페이지에 대한 값(전역 값 또는 도우미 설정)을 설정할 수 있는 코드를 실행하는 방법입니다.
  • 폴더의 모든 페이지에 대한 값을 설정할 수 있는 코드를 실행하는 방법입니다.
  • 페이지가 로드되기 전과 후에 코드를 실행하는 방법입니다.
  • 중앙 오류 페이지로 오류를 보내는 방법입니다.
  • 폴더의 모든 페이지에 인증을 추가하는 방법입니다.

자습서에서 사용되는 소프트웨어 버전

  • ASP.NET 웹 페이지(Razor) 2
  • WebMatrix 3
  • ASP.NET 웹 도우미 라이브러리(NuGet 패키지)

이 자습서는 ASP.NET 웹 도우미 라이브러리를 사용할 수 없다는 점을 제외하고 ASP.NET 웹 페이지 3 및 Visual Studio 2013(또는 웹용 Visual Studio Express 2013)에서도 작동합니다.

ASP.NET 웹 페이지 대한 웹 사이트 시작 코드 추가

ASP.NET 웹 페이지 작성하는 대부분의 코드에서 개별 페이지에는 해당 페이지에 필요한 모든 코드가 포함될 수 있습니다. 예를 들어 페이지에서 전자 메일 메시지를 보내는 경우 해당 작업에 대한 모든 코드를 단일 페이지에 배치할 수 있습니다. 여기에는 전자 메일 보내기(즉, SMTP 서버의 경우) 및 전자 메일 메시지를 보내기 위한 설정을 초기화하는 코드가 포함될 수 있습니다.

그러나 경우에 따라 사이트의 페이지가 실행되기 전에 일부 코드를 실행하려고 할 수 있습니다. 이는 사이트 내 어디에서나 사용할 수 있는 값( 전역 값이라고 함)을 설정하는 데 유용합니다. 예를 들어 일부 도우미는 이메일 설정 또는 계정 키와 같은 값을 제공해야 합니다. 이러한 설정을 전역 값으로 유지하는 것이 편리할 수 있습니다.

사이트 루트에 _AppStart.cshtml 이라는 페이지를 만들어 이 작업을 수행할 수 있습니다. 이 페이지가 있는 경우 사이트의 페이지를 처음 요청할 때 실행됩니다. 따라서 전역 값을 설정하는 코드를 실행하는 것이 좋습니다. (_AppStart.cshtml에는 밑줄 접두사 가 있으므로 사용자가 직접 요청하는 경우에도 ASP.NET 페이지를 브라우저로 보내지 않습니다.)

다음 다이어그램에서는 _AppStart.cshtml 페이지의 작동 방식을 보여 줍니다. 페이지에 대한 요청이 들어오고 사이트의 모든 페이지에 대한 첫 번째 요청인 경우 ASP.NET 먼저 _AppStart.cshtml 페이지가 있는지 확인합니다. 이 경우 _AppStart.cshtml 페이지의 코드가 실행되고 요청된 페이지가 실행됩니다.

[이미지는 App Star dot CSHTML의 작동 방식을 보여 줍니다.]

웹 사이트에 대한 전역 값 설정

  1. WebMatrix 웹 사이트의 루트 폴더에서 _AppStart.cshtml이라는 파일을 만듭니다. 파일은 사이트의 루트에 있어야 합니다.

  2. 기존 콘텐츠를 다음으로 바꿉다.

    @{
      AppState["customAppName"] = "Application Name";
    }
    

    이 코드는 사이트의 모든 페이지에서 자동으로 사용할 수 있는 값을 AppState 사전에 저장합니다. _AppStart.cshtml 파일에는 태그가 없습니다. 페이지는 코드를 실행한 다음 원래 요청된 페이지로 리디렉션됩니다.

    참고

    _AppStart.cshtml 파일에 코드를 넣을 때는 주의해야 합니다. _AppStart.cshtml 파일의 코드에서 오류가 발생하면 웹 사이트가 시작되지 않습니다.

  3. 루트 폴더에서 AppName.cshtml이라는 새 페이지를 만듭니다.

  4. 기본 태그 및 코드를 다음으로 바꿉다.

    <!DOCTYPE html>
    <html>
        <head>
            <title>Show Application Name</title>
        </head>
        <body>
            <h1>@AppState["customAppName"]</h1>
        </body>
    </html>
    

    이 코드는 _AppStart.cshtml 페이지에서 설정한 개체에서 AppState 값을 추출합니다.

  5. 브라우저에서 AppName.cshtml 페이지를 실행합니다. (실행하기 전에 파일 작업 영역에서 페이지가 선택되어 있는지 확인합니다.) 페이지에 전역 값이 표시됩니다.

    [스크린샷은 전역 값을 표시하는 페이지를 보여줍니다.]

도우미에 대한 값 설정

_AppStart.cshtml 파일에는 사이트에서 사용하고 초기화해야 하는 도우미에 대한 값을 설정하는 것이 좋습니다. 일반적인 예로 도우미에 WebMail 대한 이메일 설정과 도우미의 프라이빗 및 공개 키가 ReCaptcha 있습니다. 이와 같은 경우 _AppStart.cshtml 에서 값을 한 번 설정한 다음 사이트의 모든 페이지에 대해 이미 설정됩니다.

이 절차에서는 설정을 전역적으로 설정하는 WebMail 방법을 보여줍니다. 도우미 사용에 WebMail 대한 자세한 내용은 ASP.NET 웹 페이지 사이트에 Email 추가를 참조하세요.

  1. 아직 추가하지 않은 경우 ASP.NET 웹 페이지 사이트에 도우미 설치에 설명된 대로 웹 사이트에 ASP.NET 웹 도우미 라이브러리를 추가합니다.

  2. 아직 _AppStart.cshtml 파일이 없는 경우 웹 사이트의 루트 폴더에서 _AppStart.cshtml이라는 파일을 만듭니다.

  3. _AppStart.cshtml 파일에 다음 WebMail 설정을 추가합니다.

    @{
         // Initialize WebMail helper
         WebMail.SmtpServer = "your-SMTP-host";
         WebMail.SmtpPort = 25;
         WebMail.UserName = "your-user-name-here";
         WebMail.Password = "your-account-password";
         WebMail.From = "your-email-address-here";
    }
    

    코드에서 다음 전자 메일 관련 설정을 수정합니다.

    • 을 액세스 권한이 있는 SMTP 서버의 이름으로 설정합니다 your-SMTP-host .

    • SMTP 서버 계정의 사용자 이름으로 설정합니다 your-user-name-here .

    • SMTP 서버 계정의 암호로 설정합니다 your-account-password .

    • 을 사용자 고유의 전자 메일 주소로 설정합니다 your-email-address-here . 메시지가 전송되는 전자 메일 주소입니다. (일부 전자 메일 공급자는 다른 From 주소를 지정할 수 없으며 사용자 이름을 주소로 From 사용합니다.)

      SMTP 설정에 대한 자세한 내용은 ASP.NET 웹 페이지(Razor) 사이트에서 Email 보내기 문서의 Email설정 구성 및 ASP.NET 웹 페이지(Razor) 문제 해결 가이드Email 보내기 문제를 참조하세요.

  4. _AppStart.cshtml 파일을 저장하고 닫습니다.

  5. 웹 사이트의 루트 폴더에서 TestEmail.cshtml이라는 새 페이지를 만듭니다.

  6. 기존 콘텐츠를 다음으로 바꿉다.

    @{
        var message = "";
        try{
            if(IsPost){
                WebMail.Send(
                    to: Request.Form["emailAddress"],
                    subject: Request.Form["emailSubject"],
                    body:Request.Form["emailBody"]
               );
               message = "Email sent!";
            }
        }
        catch(Exception ex){
            message = "Email could not be sent!";
        }
    }
    <!DOCTYPE html>
    <html lang="en">
      <head>
         <meta charset="utf-8" />
         <title>Test Email</title>
      </head>
      <body>
        <h1>Test Email</h1>
        <form method="post">
          <p>
            <label for="emailAddress">Email address:</label>
            <input type="text" name="emailAddress" />
          </p>
          <p>
            <label for="emailSubject">Subject:</label>
            <input type="text" name="emailSubject" />
          </p>
          <p>
            <label for="emailBody">Text to send:</label><br/>
            <textarea name="emailBody" rows="6"></textarea>
          </p>
        <p><input type="submit" value="Send!" /></p>
        @if(IsPost){
            <p>@message</p>
        }
        </form>
      </body>
    </html>
    
  7. 브라우저에서 TestEmail.cshtml 페이지를 실행합니다.

  8. 필드를 입력하여 자신에게 전자 메일 메시지를 보낸 다음 보내기를 클릭합니다.

  9. 전자 메일을 확인하여 메시지가 수신되었는지 확인합니다.

이 예제의 중요한 부분은 SMTP 서버의 이름 및 전자 메일 자격 증명과 같이 일반적으로 변경되지 않는 설정이 _AppStart.cshtml 파일에 설정되어 있다는 것입니다. 이렇게 하면 전자 메일을 보내는 각 페이지에서 다시 설정할 필요가 없습니다. (어떤 이유로 이러한 설정을 변경해야 하는 경우 페이지에서 개별적으로 설정할 수 있습니다.) 페이지에서는 일반적으로 매번 변경되는 값(예: 받는 사람 및 전자 메일 메시지 본문)만 설정합니다.

폴더의 파일 전후 코드 실행

_AppStart.cshtml을 사용하여 사이트의 페이지가 실행되기 전에 코드를 작성할 수 있는 것처럼 특정 폴더의 페이지 실행 전후에 실행되는 코드를 작성할 수 있습니다. 폴더의 모든 페이지에 대해 동일한 레이아웃 페이지를 설정하거나 폴더에서 페이지를 실행하기 전에 사용자가 로그인했는지 확인하는 것과 같은 경우에 유용합니다.

특정 폴더의 페이지의 경우 _PageStart.cshtml이라는 파일에서 코드를 만들 수 있습니다. 다음 다이어그램에서는 _PageStart.cshtml 페이지의 작동 방식을 보여 줍니다. 페이지에 대한 요청이 들어오면 ASP.NET 먼저 _AppStart.cshtml 페이지를 확인하고 실행합니다. 그런 다음 ASP.NET _PageStart.cshtml 페이지가 있는지 확인하고, 그렇다면 실행합니다. 그런 다음, 요청된 페이지를 실행합니다.

_PageStart.cshtml 페이지 내에서 처리 중에 메서드를 포함하여 RunPage 요청된 페이지를 실행할 위치를 지정할 수 있습니다. 이렇게 하면 요청된 페이지가 실행되기 전에 코드를 실행한 다음, 그 후에 다시 코드를 실행할 수 있습니다. 를 포함하지 RunPage않으면 _PageStart.cshtml 의 모든 코드가 실행되고 요청된 페이지가 자동으로 실행됩니다.

[요청된 페이지가 자동으로 실행되는 방법을 보여주는 이미지입니다.]

ASP.NET _PageStart.cshtml 파일의 계층 구조를 만들 수 있습니다. _PageStart.cshtml 파일을 사이트의 루트 및 하위 폴더에 배치할 수 있습니다. 페이지가 요청되면 최상위 수준(사이트 루트에 가장 가까운)의 _PageStart.cshtml 파일이 실행되고, 다음 하위 폴더에서 _PageStart.cshtml 파일이 실행되며, 요청이 요청된 페이지가 포함된 폴더에 도달할 때까지 하위 폴더 구조 아래로 실행됩니다. 적용 가능한 모든 _PageStart.cshtml 파일이 실행되면 요청된 페이지가 실행됩니다.

예를 들어 다음과 같은 _PageStart.cshtml 파일과 Default.cshtml 파일이 조합되어 있을 수 있습니다.

@* ~/_PageStart.cshtml *@
@{
  PageData["Color1"] = "Red";
  PageData["Color2"] = "Blue";
}
@* ~/myfolder/_PageStart.cshtml *@
@{
  PageData["Color2"] = "Yellow";
  PageData["Color3"] = "Green";
}
@* ~/myfolder/default.cshtml *@
@PageData["Color1"]
<br/>
@PageData["Color2"]
<br/>
@PageData["Color3"]

/myfolder/default.cshtml을 실행하면 다음이 표시됩니다.

Red

Yellow

Green

폴더의 모든 페이지에 대한 초기화 코드 실행

_PageStart.cshtml 파일에는 단일 폴더의 모든 파일에 대해 동일한 레이아웃 페이지를 초기화하는 것이 좋습니다.

  1. 루트 폴더에서 InitPages라는 새 폴더를 만듭니다.

  2. 웹 사이트의 InitPages 폴더에서 _PageStart.cshtml 이라는 파일을 만들고 기본 태그 및 코드를 다음으로 바꿉니다.

    @{
        // Sets the layout page for all pages in the folder.
        Layout = "~/Shared/_Layout1.cshtml";
    
        // Sets a variable available to all pages in the folder.
        PageData["MyBackground"] = "Yellow";
    }
    
  3. 웹 사이트의 루트에서 Shared라는 폴더를 만듭니 .

  4. 공유 폴더에서 _Layout1.cshtml이라는 파일을 만들고 기본 태그 및 코드를 다음으로 바꿉니다.

    @{
      var backgroundColor = PageData["MyBackground"];
    }
    <!DOCTYPE html>
    <html>
    <head>
      <title>Page Title</title>
      <link type="text/css" href="/Styles/Site.css" rel="stylesheet" />
    </head>
    <body>
      <div id="header">
        Using the _PageStart.cshtml file
      </div>
      <div id="main" style="background-color:@backgroundColor">
        @RenderBody()
      </div>
    <div id="footer">
      &copy; 2012 Contoso. All rights reserved
    </div>
    </body>
    </html>
    
  5. InitPages 폴더에서 Content1.cshtml이라는 파일을 만들고 기존 콘텐츠를 다음으로 바꿉니다.

    <p>This is content page 1.</p>
    
  6. InitPages 폴더에서 Content2.cshtml이라는 다른 파일을 만들고 기본 태그를 다음으로 바꿉니다.

    <p>This is content page 2.</p>
    
  7. 브라우저에서 Content1.cshtml 을 실행합니다.

    [이미지는 브라우저에서 콘텐츠 1 점 CSHTML을 실행하는 것을 보여줍니다.]

    Content1.cshtml 페이지가 실행되면 _PageStart.cshtml 파일이 설정 Layout 되고 색으로도 설정 PageData["MyBackground"] 됩니다. Content1.cshtml에서 레이아웃과 색이 적용됩니다.

  8. 브라우저에서 Content2.cshtml 을 표시합니다.

    두 페이지 모두 _PageStart.cshtml에서 초기화된 것과 동일한 레이아웃 페이지와 색을 사용하므로 레이아웃은 동일합니다.

_PageStart.cshtml을 사용하여 오류 처리

_PageStart.cshtml 파일에 대한 또 다른 좋은 용도는 폴더의 모든 .cshtml 페이지에서 발생할 수 있는 프로그래밍 오류(예외)를 처리하는 방법을 만드는 것입니다. 이 예제에서는 이 작업을 수행하는 한 가지 방법을 보여줍니다.

  1. 루트 폴더에서 InitCatch라는 폴더를 만듭니다.

  2. 웹 사이트의 InitCatch 폴더에서 _PageStart.cshtml 이라는 파일을 만들고 기존 태그 및 코드를 다음으로 바꿉니다.

    @{
        try
        {
            RunPage();
        }
        catch (Exception ex)
        {
            Response.Redirect("~/Error.cshtml?source=" +
                HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath));
        }
    }
    

    이 코드에서는 블록 내에서 메서드를 호출하여 요청된 RunPage 페이지를 명시적으로 실행해 봅니다 try . 요청된 페이지에서 프로그래밍 오류가 발생하면 블록 내의 코드가 catch 실행됩니다. 이 경우 코드는 페이지(Error.cshtml)로 리디렉션되고 오류가 발생한 파일의 이름을 URL의 일부로 전달합니다. (곧 페이지를 만듭니다.)

  3. 웹 사이트의 InitCatch 폴더에서 Exception.cshtml 이라는 파일을 만들고 기존 태그 및 코드를 다음으로 바꿉니다.

    @{
        var db = Database.Open("invalidDatabaseFile");
    }
    

    이 예제를 위해 이 페이지에서 수행하는 작업은 존재하지 않는 데이터베이스 파일을 열어 의도적으로 오류를 만드는 것입니다.

  4. 루트 폴더에서 Error.cshtml 이라는 파일을 만들고 기존 태그 및 코드를 다음으로 바꿉니다.

    <!DOCTYPE html>
    <html>
        <head>
            <title>Error Page</title>
        </head>
        <body>
    <h1>Error report</h1>
    <p>An error occurred while running the following file: @Request["source"]</p>
        </body>
    </html>
    

    이 페이지에서 식 @Request["source"] 은 URL에서 값을 가져오고 표시합니다.

  5. 도구 모음에서 저장을 클릭합니다.

  6. 브라우저에서 Exception.cshtml 을 실행합니다.

    [스크린샷은 브라우저에서 예외 점 CSHTML을 실행하는 것을 보여줍니다.]

    Exception.cshtml에서 오류가 발생하기 때문에 _PageStart.cshtml 페이지는 메시지를 표시하는 Error.cshtml 파일로 리디렉션됩니다.

    예외에 대한 자세한 내용은 Razor 구문을 사용하여 ASP.NET 웹 페이지 프로그래밍 소개를 참조하세요.

_PageStart.cshtml을 사용하여 폴더 액세스 제한

_PageStart.cshtml 파일을 사용하여 폴더의 모든 파일에 대한 액세스를 제한할 수도 있습니다.

  1. WebMatrix에서 템플릿에서 사이트 옵션을 사용하여 새 웹 사이트를 만듭니다.

  2. 사용 가능한 템플릿에서 시작 사이트를 선택합니다.

  3. 루트 폴더에서 AuthenticatedContent라는 폴더를 만듭니다.

  4. AuthenticatedContent 폴더에서 _PageStart.cshtml이라는 파일을 만들고 기존 태그 및 코드를 다음으로 바꿉니다.

    @{
        Response.CacheControl = "no-cache";
        if (!WebSecurity.IsAuthenticated) {
            var returnUrl = "~/Account/Login?ReturnUrl=" + Request.Url.LocalPath;
            Response.Redirect(returnUrl);
        }
    }
    

    코드는 폴더의 모든 파일이 캐시되지 않도록 하여 시작합니다. (다음 사용자가 한 사용자의 캐시된 페이지를 사용할 수 없도록 하려면 공용 컴퓨터와 같은 시나리오에 필요합니다.) 다음으로, 코드는 사용자가 폴더의 페이지를 보기 전에 사이트에 로그인했는지 여부를 결정합니다. 사용자가 로그인하지 않으면 코드가 로그인 페이지로 리디렉션됩니다. 라는 ReturnUrl쿼리 문자열 값을 포함하는 경우 로그인 페이지에서 원래 요청된 페이지로 사용자를 반환할 수 있습니다.

  5. Page.cshtml이라는 AuthenticatedContent 폴더에 새 페이지를 만듭니다.

  6. 기본 태그를 다음으로 바꿉다.

    @{
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Authenticated Content";
    }
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
      </head>
      <body>
        Thank you for authenticating!
      </body>
    </html>
    
  7. 브라우저에서 Page.cshtml 을 실행합니다. 코드는 로그인 페이지로 리디렉션됩니다. 로그인하기 전에 등록해야 합니다. 등록하고 로그인한 후 페이지로 이동하여 해당 내용을 볼 수 있습니다.

추가 리소스

Razor 구문을 사용하여 ASP.NET 웹 페이지 프로그래밍 소개