ASP.NET Core MVC에서 뷰Views in ASP.NET Core MVC

Steve SmithLuke LathamBy Steve Smith and Luke Latham

Model-V뷰-Controller (MVC) 패턴의 보기 응용 프로그램의 데이터 프레젠테이션 및 사용자 상호 작용을 처리 합니다.In the Model-View-Controller (MVC) pattern, the view handles the app's data presentation and user interaction. 뷰의 HTML 서식 파일은 포함 된 Razor 태그합니다.A view is an HTML template with embedded Razor markup. Razor 태그는 HTML 태그를 클라이언트에 전송 되는 웹 페이지를 생성 하기 위해 상호 작용 하는 코드입니다.Razor markup is code that interacts with HTML markup to produce a webpage that's sent to the client.

ASP.NET Core MVC 뷰는 .cshtml 사용 하는 파일의 C# 프로그래밍 언어 Razor 태그에 있습니다.In ASP.NET Core MVC, views are .cshtml files that use the C# programming language in Razor markup. 파일 보기 각 응용 프로그램의 이름으로 그룹화 됩니다는 일반적으로 컨트롤러합니다.Usually, view files are grouped into folders named for each of the app's controllers. 폴더에 저장 됩니다는에 응용 프로그램의 루트 폴더:The folders are stored in a in a Views folder at the root of the app:

Visual Studio의 솔루션 탐색기에서 뷰 폴더를 열고 About.cshtml, Contact.cshtml, 및 Index.cshtml 파일 표시에 대해 홈 폴더와

컨트롤러로 표시 됩니다는 폴더는 폴더입니다.The Home controller is represented by a Home folder inside the Views folder. 폴더에 대 한 뷰는 에 대 한, 연락처, 및 인덱스 (홈페이지) 웹 페이지입니다.The Home folder contains the views for the About, Contact, and Index (homepage) webpages. 사용자는 이러한 세 가지 웹 페이지에서 컨트롤러 작업 중 하나를 요청할 때는 빌드하고 웹 페이지를 사용자에 게 반환 하는 데는 세 개의 뷰로 있는 컨트롤러 결정 합니다.When a user requests one of these three webpages, controller actions in the Home controller determine which of the three views is used to build and return a webpage to the user.

사용 하 여 레이아웃 코드 반복을 줄이고 제공 일관 된 웹 페이지 섹션도 록 합니다.Use layouts to provide consistent webpage sections and reduce code repetition. 레이아웃은 머리글, 탐색 및 메뉴 요소 및 바닥글에 종종 포함 됩니다.Layouts often contain the header, navigation and menu elements, and the footer. 머리글 및 바닥글에는 일반적으로 다양 한 메타 데이터 요소와 스크립트 및 스타일 자산에 대 한 링크에 대 한 상용구 태그를 포함 합니다.The header and footer usually contain boilerplate markup for many metadata elements and links to script and style assets. 레이아웃 보기에서이 상용구 태그를 방지 하는 데 도움이 됩니다.Layouts help you avoid this boilerplate markup in your views.

부분 뷰 재사용 가능한 부분 뷰를 관리 하 여 코드 중복을 줄입니다.Partial views reduce code duplication by managing reusable parts of views. 예를 들어, 부분 뷰 여러 뷰에 표시 되는 블로그 웹 사이트에는 만든이 약력에 유용 합니다.For example, a partial view is useful for an author biography on a blog website that appears in several views. 저자 약력 일반 보기 콘텐츠 이며 웹 페이지에 대 한 콘텐츠를 생성 하기 위해 실행할 코드가 필요 하지 않습니다.An author biography is ordinary view content and doesn't require code to execute in order to produce the content for the webpage. 저자 약력 콘텐츠는 부분 뷰를 사용 하 여이 콘텐츠 유형에 대 한 이상적인 이므로 단독으로 모델 바인딩에서 보기를 사용할 수 있습니다.Author biography content is available to the view by model binding alone, so using a partial view for this type of content is ideal.

구성 요소 확인 를 부분적으로 유사한 뷰는 반복 되는 코드를 줄일 수 있습니다 이러한 트래픽은 매우 웹 페이지를 렌더링 하는 데 서버에서 실행 하는 코드를 필요로 하는 콘텐츠 보기에 적합 합니다.View components are similar to partial views in that they allow you to reduce repetitive code, but they're appropriate for view content that requires code to run on the server in order to render the webpage. 뷰 구성 요소는 렌더링 된 콘텐츠에 쇼핑 카트 웹 사이트와 같은 데이터베이스 상호 작용 해야 하는 경우에 유용 합니다.View components are useful when the rendered content requires database interaction, such as for a website shopping cart. 뷰 구성 요소를 웹 페이지 출력을 생성 하기 위해 바인딩 모델링 제한 되지 않습니다.View components aren't limited to model binding in order to produce webpage output.

뷰를 사용할 때의 이점Benefits of using views

뷰를 설정 하는 데는 Separation of Concerns (SoC) 디자인 사용자 인터페이스 태그를 구분 하 여 MVC 응용 프로그램 내에서 응용 프로그램의 다른 부분입니다.Views help to establish a Separation of Concerns (SoC) design within an MVC app by separating the user interface markup from other parts of the app. SoC 디자인에서는 여러 가지 이점을 제공 하는 응용 프로그램 모듈식, 합니다.Following SoC design makes your app modular, which provides several benefits:

  • 앱이 하므로 더 잘 구성 된 유지 관리 하기가 더 쉽습니다.The app is easier to maintain because it's better organized. 뷰는 일반적으로 응용 프로그램 기능에 의해 그룹화 됩니다.Views are generally grouped by app feature. 이렇게 하면 보다 쉽게 기능에 대해 작업할 때 관련 된 뷰를 찾을 수 있습니다.This makes it easier to find related views when working on a feature.
  • 앱의 일부는 느슨하게 결합 되어 있습니다.The parts of the app are loosely coupled. 작성 하 고 비즈니스 논리와 데이터 액세스 구성 요소가 별도로 응용 프로그램의 뷰를 업데이트할 수 있습니다.You can build and update the app's views separately from the business logic and data access components. 반드시 응용 프로그램의 다른 부분을 업데이트 하지 않고 응용 프로그램의 뷰를 수정할 수 있습니다.You can modify the views of the app without necessarily having to update other parts of the app.
  • 응용 프로그램의 사용자 인터페이스 부분 뷰는 별도 단위 테스트 하는 것이 쉽습니다.It's easier to test the user interface parts of the app because the views are separate units.
  • 더 나은 조직으로 인해 확률이 실수로 반복 부분은 사용자 인터페이스를 합니다.Due to better organization, it's less likely that you'll accidently repeat sections of the user interface.

보기를 만드는 방법Creating a view

에 컨트롤러에만 적용 되는 뷰가 생성 됩니다는 뷰 / [ControllerName] 폴더입니다.Views that are specific to a controller are created in the Views/[ControllerName] folder. 컨트롤러 간에 공유 되는 뷰에 배치 되는 뷰/공유 폴더입니다.Views that are shared among controllers are placed in the Views/Shared folder. 뷰를 만들려면 새 파일을 추가 하 고 동일한 이름으로 연결 된 컨트롤러 작업으로 지정 된 .cshtml 파일 확장명입니다.To create a view, add a new file and give it the same name as its associated controller action with the .cshtml file extension. 와 일치 하는 보기를 만들려면는 에 대 한 작업에는 컨트롤러를 만듭니다는 About.cshtml 파일에 뷰/홈폴더:To create a view that corresponds with the About action in the Home controller, create an About.cshtml file in the Views/Home folder:

@{
    ViewData["Title"] = "About";
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>

<p>Use this area to provide additional information.</p>

Razor 로 시작 태그는 @ 기호입니다.Razor markup starts with the @ symbol. C#을 배치 하 여 실행된 C# 문 내에서 코드 Razor 코드 블록 중괄호을 off로 설정 ({ ... }).Run C# statements by placing C# code within Razor code blocks set off by curly braces ({ ... }). 예를 들어 "정보"의 할당을 참조 ViewData["Title"] 위에 표시 된 합니다.For example, see the assignment of "About" to ViewData["Title"] shown above. 단순히 값과 참조 하 여 HTML 내에서 값을 표시할 수 있습니다는 @ 기호입니다.You can display values within HTML by simply referencing the value with the @ symbol. 내용을 참조는 <h2><h3> 위의 요소입니다.See the contents of the <h2> and <h3> elements above.

위에 표시 된 콘텐츠 보기에는 사용자에 게 렌더링 되는 전체 웹 페이지의 일부일 뿐입니다.The view content shown above is only part of the entire webpage that's rendered to the user. 페이지의 레이아웃의 나머지 및 다른 일반적인 보기의 요소에는 다른 보기 파일에서 지정 됩니다.The rest of the page's layout and other common aspects of the view are specified in other view files. 자세한 내용은 참조는 레이아웃 항목합니다.To learn more, see the Layout topic.

컨트롤러 뷰를 지정 하는 방법How controllers specify views

뷰는으로 작업에서 일반적으로 반환 되는 ViewResult의 형식인 ActionResult합니다.Views are typically returned from actions as a ViewResult, which is a type of ActionResult. 동작 메서드에서 만들고 반환할 수는 ViewResult 를 직접 하지만 일반적으로 수행 되지 않습니다.Your action method can create and return a ViewResult directly, but that isn't commonly done. 대부분의 컨트롤러에서 상속 하므로 컨트롤러를 그대로 사용 하면는 View 반환 하는 도우미 메서드는 ViewResult:Since most controllers inherit from Controller, you simply use the View helper method to return the ViewResult:

HomeController.csHomeController.cs

public IActionResult About()
{
    ViewData["Message"] = "Your application description page.";

    return View();
}

이 작업을 반환 하는 경우는 About.cshtml 마지막 섹션에 표시 된 보기는 다음과 같은 웹 페이지로 렌더링 됩니다.When this action returns, the About.cshtml view shown in the last section is rendered as the following webpage:

Microsoft Edge 브라우저에서 렌더링 된 페이지에 대 한

View 도우미 메서드에 몇 가지 오버 로드 합니다.The View helper method has several overloads. 필요에 따라 다음을 지정할 수 있습니다.You can optionally specify:

  • 반환할 명시적 보기:An explicit view to return:

    return View("Orders");
    
  • A 모델 에 전달 하는 보기:A model to pass to the the view:

    return View(Orders);
    
  • 뷰를 모두 모델:Both a view and a model:

    return View("Orders", Orders);
    

검색 보기View discovery

작업 뷰를 반환 하는 경우 프로세스를 호출할 보기 검색 이루어집니다.When an action returns a view, a process called view discovery takes place. 이 프로세스 보기 이름을 기반으로 어떤 보기 파일을 사용 하는 것을 결정 합니다.This process determines which view file is used based on the view name.

기본적으로는 View 메서드 (return View();) 호출 될 작업 메서드와 같은 이름의 뷰를 반환 하는 것입니다.The default behavior of the View method (return View();) is to return a view with the same name as the action method from which it's called. 예를 들어는 에 대 한 ActionResult 메서드 컨트롤러의 이름은 뷰 파일에 대 한 검색 About.cshtml합니다.For example, the About ActionResult method name of the controller is used to search for a view file named About.cshtml. 런타임은 먼저는 뷰 / [ControllerName] 뷰에 대 한 폴더입니다.First, the runtime looks in the Views/[ControllerName] folder for the view. 일치 하는 뷰를 찾지 못하는 경우 검색 된 Shared 폴더 뷰에 대 한 합니다.If it doesn't find a matching view there, it searches the Shared folder for the view.

암시적으로 반환 하는 경우 문제가 되지 않습니다는 ViewResultreturn View(); 에 보기 이름을 명시적으로 전달 하거나는 View 메서드 return View("<ViewName>");합니다.It doesn't matter if you implicitly return the ViewResult with return View(); or explicitly pass the view name to the View method with return View("<ViewName>");. 두 경우 모두 뷰의 검색이이 순서에서 일치 하는 파일의 보기에 대 한 검색합니다.In both cases, view discovery searches for a matching view file in this order:

  1. 뷰 /[ControllerName][ViewName].cshtmlViews/[ControllerName][ViewName].cshtml
  2. 뷰/공유/[ViewName].cshtmlViews/Shared/[ViewName].cshtml

뷰 이름 대신 뷰 파일 경로 제공할 수 있습니다.A view file path can be provided instead of a view name. 응용 프로그램 루트에서 시작 하는 절대 경로 사용 하는 경우 (필요에 따라부터 "/" 또는 "~ /"), .cshtml 확장을 지정 해야 합니다.If using an absolute path starting at the app root (optionally starting with "/" or "~/"), the .cshtml extension must be specified:

return View("Views/Home/About.cshtml");

없이 서로 다른 디렉터리에 뷰를 지정 하는 상대 경로 사용할 수도 있습니다는 .cshtml 확장 합니다.You can also use a relative path to specify views in different directories without the .cshtml extension. 내에서 HomeController를 반환할 수 있습니다는 인덱스 볼 수 프로그램 관리 상대 경로 사용 하 여 뷰:Inside the HomeController, you can return the Index view of your Manage views with a relative path:

return View("../Manage/Index");

마찬가지로, 현재 컨트롤러 관련 디렉터리를 나타낼 수 있습니다는 ". /" 접두사:Similarly, you can indicate the current controller-specific directory with the "./" prefix:

return View("./About");

부분 뷰구성 요소 확인 (비슷하지만 동일 하지 않은) 검색 메커니즘을 사용 합니다.Partial views and view components use similar (but not identical) discovery mechanisms.

사용자 지정을 사용 하 여 응용 프로그램 내에 있는 뷰는 방법에 대 한 기본 규칙을 사용자 지정할 수 있습니다 IViewLocationExpander합니다.You can customize the default convention for how views are located within the app by using a custom IViewLocationExpander.

검색 보기는 파일 이름으로 뷰 파일을 찾는 데 사용 합니다.View discovery relies on finding view files by file name. 기본 파일 시스템은 대/소문자 구분, 하는 경우 뷰 이름이 아마도 대/소문자 구분 됩니다.If the underlying file system is case sensitive, view names are probably case sensitive. 운영 체제에서 호환성을 위해 대/소문자 컨트롤러 및 작업 이름 및 관련된 보기 폴더와 파일 이름 사이입니다.For compatibility across operating systems, match case between controller and action names and associated view folders and file names. 대/소문자 구분 파일 시스템으로 작업 하는 동안 파일 보기를 찾을 수 없는 오류가 발생 하는 경우 요청 된 뷰 파일과 실제 보기 파일 이름 간의 대/소문자와 일치 하는지 확인 합니다.If you encounter an error that a view file can't be found while working with a case-sensitive file system, confirm that the casing matches between the requested view file and the actual view file name.

컨트롤러, 작업 및 유지 관리 및 명확성에 대 한 뷰 간의 관계를 반영 하기 위해 보기에 대 한 파일 구조를 구성 하는 모범 사례를 따릅니다.Follow the best practice of organizing the file structure for your views to reflect the relationships among controllers, actions, and views for maintainability and clarity.

보기에 데이터를 전달합니다.Passing data to views

여러 가지 방법으로 사용 하 여 보기에 데이터를 전달할 수 있습니다.You can pass data to views using several approaches. 지정 하는 가장 강력한 방법입니다는 모델 보기에는 형식입니다.The most robust approach is to specify a model type in the view. 이 모델은 일반적으로 라고는 viewmodel합니다.This model is commonly referred to as a viewmodel. 동작에서 보기를 viewmodel 형식의 인스턴스로 전달 합니다.You pass an instance of the viewmodel type to the view from the action.

활용 하기 위해 뷰를 사용 하면 데이터 보기를 전달 하는 viewmodel를 사용 하 여 강력한 형식 검사 합니다.Using a viewmodel to pass data to a view allows the view to take advantage of strong type checking. 강력한 형식화 (또는 강력한 형식의) 모든 변수 및 상수에 명시적으로 정의 된 유형을 의미 (예를 들어 string, int, 또는 DateTime).Strong typing (or strongly-typed) means that every variable and constant has an explicitly defined type (for example, string, int, or DateTime). 컴파일 타임에 보기에서 사용 되는 형식의 유효성이 검사 됩니다.The validity of types used in a view is checked at compile time.

Visual StudioVisual Studio Code 이라는 기능을 사용 하 여 강력한 형식의 클래스 멤버의 목록을 IntelliSense합니다.Visual Studio and Visual Studio Code list strongly-typed class members using a feature called IntelliSense. viewmodel 속성을 확인 하려는 경우 다음에 마침표 viewmodel에 대 한 변수 이름을 입력 (.).When you want to see the properties of a viewmodel, type the variable name for the viewmodel followed by a period (.). 이 오류를 줄일 수 코드를 더 빠르게 작성할 수 있습니다.This helps you write code faster with fewer errors.

사용 하 여 모델을 지정 된 @model 지시문입니다.Specify a model using the @model directive. 사용 하 여 모델을 사용 하 여 @Model:Use the model with @Model:

@model WebApplication1.ViewModels.Address

<h2>Contact</h2>
<address>
    @Model.Street<br>
    @Model.City, @Model.State @Model.PostalCode<br>
    <abbr title="Phone">P:</abbr> 425.555.0100
</address>

보기에 모델을 제공 하려면 컨트롤러 매개 변수로 전달 합니다.To provide the model to the view, the controller passes it as a parameter:

public IActionResult Contact()
{
    ViewData["Message"] = "Your contact page.";

    var viewModel = new Address()
    {
        Name = "Microsoft",
        Street = "One Microsoft Way",
        City = "Redmond",
        State = "WA",
        PostalCode = "98052-6399"
    };

    return View(viewModel);
}

보기를 제공할 수 있는 모델 유형에 대해 제한은 없습니다.There are no restrictions on the model types that you can provide to a view. 사용 하는 것이 좋습니다 P텍스트만 Old CLR O되며 개체 (POCO) viewmodel 거의 또는 전혀 (메서드) 정의 된 동작입니다.We recommend using Plain Old CLR Object (POCO) viewmodels with little or no behavior (methods) defined. Viewmodel 클래스에 저장 되거나는 일반적으로 모델 폴더 또는 별도 Viewmodel 응용 프로그램의 루트 폴더에 있습니다.Usually, viewmodel classes are either stored in the Models folder or a separate ViewModels folder at the root of the app. 주소 viewmodel 위의 예제에서 사용 되는 라는 파일에 저장 된 POCO viewmodel Address.cs:The Address viewmodel used in the example above is a POCO viewmodel stored in a file named Address.cs:

namespace WebApplication1.ViewModels
{
    public class Address
    {
        public string Name { get; set; }
        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
    }
}

참고

아무 것도 동일한 클래스를 사용 하 여 프로그램 viewmodel 유형과 비즈니스 모델 유형에 대 한 수 없습니다.Nothing prevents you from using the same classes for both your viewmodel types and your business model types. 그러나 별도 모델을 사용 하 여 다 하지 독립적으로 비즈니스 논리 및 데이터 액세스 부분 응용 프로그램의 사용자 보기 수 있습니다.However, using separate models allows your views to vary independently from the business logic and data access parts of your app. 모델 및 viewmodel 분리도 이점을 보안 모델이 사용 하면 모델 바인딩유효성 검사 사용자가 응용 프로그램에 전송 되는 데이터에 대 한 합니다.Separation of models and viewmodels also offers security benefits when models use model binding and validation for data sent to the app by the user.

약한 형식의 데이터 (ViewData 및 ViewBag)Weakly-typed data (ViewData and ViewBag)

강력한 형식의 뷰 외에도 뷰는에 대 한 액세스는 약한 형식의 (호출 또한 자유로운 형식의) 데이터의 컬렉션입니다.In addition to strongly-typed views, views have access to a weakly-typed (also called loosely-typed) collection of data. 강력한 종류와 달리 약한 형식 (또는 형식 느슨한)를 사용 하는 데이터 형식에 있는 명시적으로 선언 하지 않는 것을 의미 합니다.Unlike strong types, weak types (or loose types) means that you don't explicitly declare the type of data you're using. 적은 양의 컨트롤러와 뷰 간에 데이터를 전달 하기 위한 약한 형식의 데이터의 컬렉션을 사용할 수 있습니다.You can use the collection of weakly-typed data for passing small amounts of data in and out of controllers and views.

데이터 전달는 중...Passing data between a ... 예제Example
컨트롤러와 뷰Controller and a view 드롭다운 목록을 데이터를 채웁니다.Populating a dropdown list with data.
보기 및 레이아웃 보기View and a layout view 설정의 <제목 > 보기 파일에서는 레이아웃 보기의 요소 내용입니다.Setting the <title> element content in the layout view from a view file.
부분 뷰 및 보기Partial view and a view 사용자 요청 하는 웹 페이지에 따라 데이터를 표시 하는 위젯입니다.A widget that displays data based on the webpage that the user requested.

이 컬렉션을 통해 참조 될 수 있습니다는 ViewData 또는 ViewBag 컨트롤러와 뷰는 속성입니다.This collection can be referenced through either the ViewData or ViewBag properties on controllers and views. ViewData 속성은 약한 형식의 개체의 사전입니다.The ViewData property is a dictionary of weakly-typed objects. ViewBag 속성은 한 래퍼 ViewData 기본에 대 한 동적 속성을 제공 하는 ViewData 컬렉션입니다.The ViewBag property is a wrapper around ViewData that provides dynamic properties for the underlying ViewData collection.

ViewDataViewBag 런타임에 동적으로 확인 됩니다.ViewData and ViewBag are dynamically resolved at runtime. 컴파일 타임 형식 검사를 제공 하지 않는 둘 다은 일반적으로 더 오류가 viewmodel를 사용 하는 것입니다.Since they don't offer compile-time type checking, both are generally more error-prone than using a viewmodel. 이러한 이유로, 일부 개발자가 최소한 또는 never를 사용 하려는 ViewDataViewBag합니다.For that reason, some developers prefer to minimally or never use ViewData and ViewBag.

ViewDataViewData

ViewDataViewDataDictionary 개체를 통해 액세스 string 키입니다.ViewData is a ViewDataDictionary object accessed through string keys. 문자열 데이터를 저장 하 고 캐스트에 대 한 필요 없이 직접 사용할 수 있지만 다른 캐스팅 해야 ViewData 추출 하면 특정 형식에 대 한 값 개체입니다.String data can be stored and used directly without the need for a cast, but you must cast other ViewData object values to specific types when you extract them. 사용할 수 있습니다 ViewData 보기 및 보기를 포함 하 여 내에서 컨트롤러에서 데이터를 전달 하 부분 뷰레이아웃합니다.You can use ViewData to pass data from controllers to views and within views, including partial views and layouts.

다음은 인사말 및 사용 하 여 주소에 대 한 값을 설정 하는 예제 ViewData 동작에서:The following is an example that sets values for a greeting and an address using ViewData in an action:

public IActionResult SomeAction()
{
    ViewData["Greeting"] = "Hello";
    ViewData["Address"]  = new Address()
    {
        Name = "Steve",
        Street = "123 Main St",
        City = "Hudson",
        State = "OH",
        PostalCode = "44236"
    };

    return View();
}

보기에서 데이터와 함께 작동 합니다.Work with the data in a view:

@{
    // Since Address isn't a string, it requires a cast.
    var address = ViewData["Address"] as Address;
}

@ViewData["Greeting"] World!

<address>
    @address.Name<br>
    @address.Street<br>
    @address.City, @address.State @address.PostalCode
</address>

ViewBagViewBag

ViewBagDynamicViewData 에 저장 된 개체에 대 한 동적 액세스를 제공 하는 개체 ViewData합니다.ViewBag is a DynamicViewData object that provides dynamic access to the objects stored in ViewData. ViewBag캐스팅 필요 하지 않으므로 작업할 더 편리할 수 있습니다.ViewBag can be more convenient to work with, since it doesn't require casting. 다음 예제에서는 사용 하는 방법을 보여 줍니다. ViewBag 사용 하 여 동일한 결과 함께 ViewData 위에:The following example shows how to use ViewBag with the same result as using ViewData above:

public IActionResult SomeAction()
{
    ViewBag.Greeting = "Hello";
    ViewBag.Address  = new Address()
    {
        Name = "Steve",
        Street = "123 Main St",
        City = "Hudson",
        State = "OH",
        PostalCode = "44236"
    };

    return View();
}
@ViewBag.Greeting World!

<address>
    @ViewBag.Address.Name<br>
    @ViewBag.Address.Street<br>
    @ViewBag.Address.City, @ViewBag.Address.State @ViewBag.Address.PostalCode
</address>

ViewData 및 ViewBag를 동시에 사용 하 여Using ViewData and ViewBag simultaneously

이후 ViewDataViewBag 동일한 기본 참조 ViewData 컬렉션을 모두 사용할 수 있습니다 ViewDataViewBag 혼합 및 경우에 읽기 및 쓰기 값 사이 일치 합니다.Since ViewData and ViewBag refer to the same underlying ViewData collection, you can use both ViewData and ViewBag and mix and match between them when reading and writing values.

사용 하 여 제목을 설정 ViewBag 사용 하 여 설명 및 ViewData 맨 위에 있는 About.cshtml 보기:Set the title using ViewBag and the description using ViewData at the top of an About.cshtml view:

@{
    Layout = "/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About Contoso";
    ViewData["Description"] = "Let us tell you about Contoso's philosophy and mission.";
}

속성을 읽지만 사용 역방향 ViewDataViewBag합니다.Read the properties but reverse the use of ViewData and ViewBag. _Layout.cshtml 파일을 사용 하 여 제목 가져오는 ViewData 사용 하 여 설명을 가져오는 및 ViewBag:In the _Layout.cshtml file, obtain the title using ViewData and obtain the description using ViewBag:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ViewData["Title"]</title>
    <meta name="description" content="@ViewBag.Description">
    ...

문자열에 대 한 캐스트 필요 하지 않는 ViewData합니다.Remember that strings don't require a cast for ViewData. 사용할 수 있습니다 @ViewData["Title"] 캐스팅 하지 않은 채 합니다.You can use @ViewData["Title"] without casting.

모두 사용 하 여 ViewDataViewBag 에 혼합 및 읽기 및 쓰기 속성 일치와 같은 시간 작동 합니다.Using both ViewData and ViewBag at the same time works, as does mixing and matching reading and writing the properties. 다음 태그 렌더링 됩니다.The following markup is rendered:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>About Contoso</title>
    <meta name="description" content="Let us tell you about Contoso's philosophy and mission.">
    ...

ViewBag ViewData 사이의 차이 요약Summary of the differences between ViewData and ViewBag

  • ViewData
    • 파생 ViewDataDictionary는와 같은 유용할 수 있는 사전 속성이 있으므로 ContainsKey, Add, Remove, 및 Clear합니다.Derives from ViewDataDictionary, so it has dictionary properties that can be useful, such as ContainsKey, Add, Remove, and Clear.
    • 사전에 키는 문자열이 공백을 사용할 수 있도록 합니다.Keys in the dictionary are strings, so whitespace is allowed. 예: ViewData["Some Key With Whitespace"]Example: ViewData["Some Key With Whitespace"]
    • 모든 형식 이외의 다른는 string 뷰를 인덱싱하지에 캐스팅 해야 ViewData합니다.Any type other than a string must be cast in the view to use ViewData.
  • ViewBag
    • 파생 DynamicViewData점 표기법을 사용 하 여 동적 속성 만들기를 허용 하므로 (@ViewBag.SomeKey = <value or object>), 및 캐스트는 필요 없습니다.Derives from DynamicViewData, so it allows the creation of dynamic properties using dot notation (@ViewBag.SomeKey = <value or object>), and no casting is required. 구문은 ViewBag 사용 하면 신속 하 게 컨트롤러와 뷰를 추가할 수 있습니다.The syntax of ViewBag makes it quicker to add to controllers and views.
    • 간단 하 게 null 값을 확인 합니다.Simpler to check for null values. 예: @ViewBag.Person?.NameExample: @ViewBag.Person?.Name

ViewData 또는 ViewBag을 사용 하는 경우When to use ViewData or ViewBag

둘 다 ViewDataViewBag 적은 양의 컨트롤러와 뷰 간에 데이터를 전달 하는 올바른 방법을 동등 하 게 합니다.Both ViewData and ViewBag are equally valid approaches for passing small amounts of data among controllers and views. 하나를 사용 하 여 (또는 둘 다)을 보였습니다 개인의 기본 설정 또는 해당 조직의 기본 설정을 선택 합니다.The choice of which one to use (or both) comes down to personal preference or the preference of your organization. 혼합 일치 수 있지만 ViewDataViewBag 개체 코드를 읽고 하나만 선택 하 고 일관 되 게 사용 하는 경우 유지 관리 하기가 더 쉽습니다.Though you can mix and match ViewData and ViewBag objects, the code is easier to read and maintain when you choose only one and use it consistently. 둘 다 런타임에 동적으로 해결 되 고 따라서 런타임 오류가 발생 하기 쉽습니다 되므로 주의 해 서 사용 합니다.Since both are dynamically resolved at runtime and thus prone to causing runtime errors, use them carefully. 일부 개발자가 완전히 방지할 합니다.Some developers avoid them completely.

동적 뷰Dynamic views

모델 선언 하지 마십시오 하는 뷰를 사용 하 여 입력 @model 있지만 이러한 메서드에 전달 된 모델 인스턴스를 갖는 (예를 들어 return View(Address);) 인스턴스 속성을 동적으로 참조할 수 있습니다.Views that don't declare a model type using @model but that have a model instance passed to them (for example, return View(Address);) can reference the instance's properties dynamically:

<address>
    @Model.Street<br>
    @Model.City, @Model.State @Model.PostalCode<br>
    <abbr title="Phone">P:</abbr> 425.555.0100
</address>

이 기능은 유연성을 제공 되지만 컴파일 보호 지정 또는 IntelliSense 기능이 제공 하지 않습니다.This feature offers flexibility but doesn't offer compilation protection or IntelliSense. 속성이 존재 하지 않으면 런타임 시 웹 페이지 생성이 실패 합니다.If the property doesn't exist, webpage generation fails at runtime.

더 많은 보기 기능More view features

태그 도우미 쉽게 기존 HTML 태그에 서버 쪽 동작을 추가 합니다.Tag Helpers make it easy to add server-side behavior to existing HTML tags. 태그 도우미를 사용 하 여 사용자 지정 코드 또는 보기 내에서 도우미를 작성할 필요가 방지할 수 있습니다.Using Tag Helpers avoids the need to write custom code or helpers within your views. 태그 도우미 HTML 요소에 특성으로 적용 되 고 처리할 수 있는 편집기에서 무시 됩니다.Tag helpers are applied as attributes to HTML elements and are ignored by editors that can't process them. 이 옵션을 사용 하면 편집 하 고 다양 한 도구에서에서 뷰 태그를 렌더링할 수 있습니다.This allows you to edit and render view markup in a variety of tools.

사용자 지정 HTML 태그를 생성 하는 많은 기본 제공 HTML 도우미와 수행할 수 있습니다.Generating custom HTML markup can be achieved with many built-in HTML Helpers. 더 복잡 한 사용자 인터페이스 논리에서 처리 될 수 구성 요소 보기합니다.More complex user interface logic can be handled by View Components. 뷰 구성 요소는 동일한 SoC 해당 컨트롤러를 제공 하 고 뷰 제공 됩니다.View components provide the same SoC that controllers and views offer. 동작 및 뷰가 공통 사용자 인터페이스 요소에 의해 사용 되는 데이터를 처리 하는 대 한 필요성을 제거할 수 있습니다.They can eliminate the need for actions and views that deal with data used by common user interface elements.

ASP.NET Core의 다른 많은 요소와 마찬가지로 뷰 지원 종속성 주입, 서비스 수를 허용 뷰에 주입 된합니다.Like many other aspects of ASP.NET Core, views support dependency injection, allowing services to be injected into views.