ViewData와 ViewBag의 차이점은 무엇입니까?


답변:


388

C # 4.0 동적 기능을 사용합니다. 뷰 데이터와 동일한 목표를 달성하며 강력한 형식의 뷰 모델을 사용하는 것을 피해야합니다 (뷰 데이터를 피해야하는 것과 같은 방식).

따라서 기본적으로 마술 문자열을 대체합니다 .

ViewData["Foo"]

마법 속성 :

ViewBag.Foo

컴파일 타임 안전이 없습니다.

저는이 개념을 MVC에 도입 한 것에 대해 Microsoft를 계속 비난합니다.

속성 이름은 대소 문자를 구분합니다.


11
어떤 목적으로 Microsoft를 비난하고 있습니까? 뷰 데이터가 없다면 드롭 다운 목록을 모델에서 어떻게 바인딩 할 수 있습니까? (모델 내에서 selectlist를 사용하는 것이 좋은 생각은 아닙니다)
Subin Jacob

15
@SubinJacob 이에 대한 답변을 원한다면 실제로 새로운 질문을해야합니다. 선택 목록을 작성하면 드롭 다운 목록을 만들 수 있습니다.
MiniRagnarok

25
나는 조금 주관적이라고 생각합니다. 강력한 형식의 모델은 훌륭하고 yada yada이지만 뷰를 빠르게 실행하고 실행하는 시나리오의 경우 ViewBag와 마찬가지로 Controller, View, Model, AutoMapper to ViewModel 등보다 작업을 더 빨리 수행합니다.
Craig Brett

11
@Darin, 이것을 소개 한 이유는 무엇입니까? 개발자에게 제공되는 도구 일뿐입니다. 당신이하고있는 일을 안다면, 그것을 최대한 활용할 수 있습니다. 마음에 들지 않거나 오류가 발생하기 쉬운 것처럼 느껴지면 사용하지 마십시오. :)
Bilal Fazlani 9

5
부분과 레이아웃 사이에 데이터를 전달하는 방법은 무엇입니까? 사람들은 전체 그림을 볼 수 없을 때 비난합니다. 베이스 컨트롤러와 기본 뷰 모델 또는 정적 / 단일 객체가 어디에나 있다고 생각합니다. 보기 데이터를 사용하는 방법을 배우고 업무에 잘못된 도구를 사용하는 것에 대해 스스로를 비난하십시오.
Bart Calixto

42

내부적으로 ViewBag 속성은 ViewData 사전 에 이름 / 값 쌍으로 저장됩니다 .

참고 : MVC 3의 대부분의 시험판 버전에서 MVC 3 릴리스 정보의이 스 니펫에 언급 된대로 ViewBag 속성의 이름은 ViewModel로 지정되었습니다.

(편집 10-8-12) 내가 게시 한이 정보의 출처를 게시하는 것이 좋습니다. 여기에 출처가 있습니다. http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

MVC 2 컨트롤러는 늦은 바인딩 사전 API를 사용하여 데이터를 뷰 템플릿으로 전달할 수있는 ViewData 속성을 지원합니다. MVC 3에서는 동일한 목적을 달성하기 위해 ViewBag 속성에 다소 간단한 구문을 사용할 수도 있습니다. 예를 들어 ViewData [ "Message"] = "text"를 작성하는 대신 ViewBag.Message = "text"를 작성할 수 있습니다. ViewBag 속성을 사용하기 위해 강력한 형식의 클래스를 정의 할 필요가 없습니다. 동적 속성이므로 속성을 가져 오거나 설정할 수 있으며 런타임시 동적으로 속성을 해결합니다. 내부적으로 ViewBag 속성은 ViewData 사전에 이름 / 값 쌍으로 저장됩니다. (참고 : MVC 3의 시험판 버전에서 대부분의 ViewBag 속성은 ViewModel 속성으로 명명되었습니다.)


질문은에 대한 것이 아니라 ViewData와 의 차이점을 묻습니다 . ViewBagViewModel
Matthew Flaschen

수고한 Matthew Flaschen에게 감사의 말을 전하며 응답에 오타가있어 수정했습니다. 이제 실수였던 ViewModel 대신 "ViewData"를 읽습니다. :)
Rich Bianco

이제 잘못되었습니다. 둘 다 다른 이름으로 바뀌지 않았습니다. 그들은 여전히 ​​존재합니다. 하나는 dynamic지원합니다 ViewBag.Message. 하나는 이전 ViewData["Message"]구문을 사용 합니다.
Matthew Flaschen

1
+1 그러나, 어떤 출처에서 인용하고 있습니까? 실제로 링크를 제공해야합니다.
Sam

1
제안 해 주셔서 감사합니다. 원본 소스에 대한 링크를 추가했습니다.
Rich Bianco

34

MVC의 ViewBag 및 ViewData

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ViewBag와 ViewData의 유사점 :

컨트롤러에서보기로 이동할 때 데이터를 유지하는 데 도움이됩니다. 컨트롤러에서 해당보기로 데이터를 전달하는 데 사용됩니다. 수명이 짧다는 것은 리디렉션이 발생할 때 값이 null이됨을 의미합니다. 이는 컨트롤러와 뷰 간 통신 방법을 제공하는 것이 목표이기 때문입니다. 서버 호출 내의 통신 메커니즘입니다.

ViewBag와 ViewData의 차이점 :

ViewData는 ViewDataDictionary 클래스에서 파생되고 문자열을 키로 사용하여 액세스 할 수있는 개체의 사전입니다. ViewBag는 C # 4.0의 새로운 동적 기능을 활용하는 동적 속성입니다. ViewData에는 복잡한 데이터 유형에 대한 유형 변환이 필요하며 오류를 피하기 위해 null 값을 확인하십시오. ViewBag는 복잡한 데이터 유형에 대한 유형 변환이 필요하지 않습니다.

ViewBag 및 ViewData 예 :

public ActionResult Index()
{   
    ViewBag.Name = "Arun Prakash";   
    return View();
}

public ActionResult Index()
{  
    ViewData["Name"] = "Arun Prakash";  
    return View();
}   

보기에서 호출

@ViewBag.Name    
@ViewData["Name"]

7
귀하의 답변은 표시 typecasting하지만 타입 캐스팅이 수행되는 방법을 보여주지 않았습니다
Alex

31

ViewData: 복잡한 데이터 유형에 대한 유형 캐스팅이 필요하며 오류를 피하기 위해 null 값을 확인합니다.

ViewBag: 복잡한 데이터 유형에 대한 유형 캐스팅이 필요하지 않습니다.

다음 예제를 고려하십시오.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}

코드 View는 다음과 같습니다.

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>

6
이해하는 데 도움이되지만 실수가 있다고 생각합니다. 이 <h4>@ViewBag.emp.Name</h4> 변경한다<h4>@ViewBag.Employee.Name</h4>
베니 마르 갈 리트

24

모든 답변은 제안 ViewBag및 / 또는 ViewData데이터를 전달하는 것입니다 ControllerViews 잘못된 정보이다. 둘 다 뷰에서 레이아웃으로 또는 부분으로 뷰 (또는 ViewComponents 등)로 데이터를 전달하는 데 매우 유용합니다. 컨트롤러 전용이 아닙니다.

기본 asp.net 샘플이 레이아웃 페이지에 다음과 같이 있습니다.

<title>@ViewData["Title"] - MyApp</title>

그리고 어떤 관점에서

ViewData["Title"] = "Details";

그럼, 질문을에 "무슨 사이의 차이점 ViewBagViewData ?"

가장 눈에 띄는 차이점은 ViewData강력한 형식의 사전이며 ViewBag동적 형식입니다.

내부 데이터 는 동일합니다.

ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";

서로를 언제 사용해야합니까?

  • ViewBag유효한 C # 이름을 지원하지 않습니다. 당신은에 액세스 할 수 없습니다 ViewData["Key With Space"]ViewBag
  • ViewBag.Something 동적이며 컴파일 타임에 정확한 매개 변수를 알아야하는 확장 메서드와 같은 메서드를 호출 할 때 문제가 발생할 수 있습니다.
  • ViewBag null 구문 클리너를 확인할 수 있습니다. ViewBag.Person?.Name
  • ViewData같은 사전의 모든 속성이 ContainsKey, Add당신이 사용할 수 있도록 등 ViewData.Add("somekey", "somevalue")은 예외를 던질 수 염두에 두어야합니다.
  • ViewData뷰에서 사용 하려면 TypeCasting이 필요하지만 ViewBag그렇지 않습니다.

미묘한 차이점을 아는 것은 하나 이상의 맛을 선호하는 것입니다.

일반적으로 ViewBag.AnyKey별칭은ViewData["AnyKey"]


14

어느 쪽도 사용하지 말 것을 권할 수 있습니까?

데이터를 화면에 "보내려면"테스트하기 쉽기 때문에 강력한 형식의 개체 (AKA ViewModel)를 보내십시오.

일종의 "모델"에 바인딩하고 임의의 "viewbag"또는 "viewdata"항목이 있으면 자동화 된 테스트가 매우 어렵습니다.

이것을 사용하는 경우 어떻게 재구성하고 ViewModel을 사용할 수 있는지 고려하십시오.


4
"컴파일러가 첫 번째 단위 테스트입니다"원칙을 무시하면 정적 형식 뷰 모델은 어떻게 코드를 동적 형식보다 테스트 할 수있게합니까? 동적으로 유형이 지정된 솔루션에서는 테스트 요구 사항이 더 중요하지만 두 솔루션 모두 동일한 수와 유형의 테스트를 구현하면 아무것도 잃지 않습니다.
대런 루이스

동의합니다. 약간 모호합니다. 아마도 지능이 관련되어있을 것입니다.
Joshua Ramirez

1
한 가지 예는 조롱입니다. 컨트롤러 동작을 단위로 테스트하려면 일부 문자열이 사전에 추가되었거나 동적 필드가 일부 값으로 설정되어 있다고 주장하는 대신 전달하고 어설 션하는 "mock"객체를 생성하는 것이 더 쉽습니다. 하나의 "요청"과 하나의 "응답"오브젝트를 갖는 서비스 계약과 유사한 개념으로 여러 매개 변수를 사용하지 않습니다.
nootn

둘 중 하나를 사용하지 않으면 어떻게 View에서 Layout으로 데이터를 전달합니까? -1
Bart Calixto

이것이 어떻게 대답입니까?
JSON


6

viewdata : View와 controller 사이에 데이터를 저장하는 데 사용되는 사전입니다 .u 뷰 데이터 객체를 뷰에서 해당 모델로 캐스팅하여 데이터를 검색해야합니다 ...

ViewBag : 뷰 데이터와 유사한 동적 속성이지만 뷰에서 사용하기 전에 압축 모델로 캐스팅 할 필요가 없습니다.


4

아래는 ViewData, ViewBag, TempData & Session에 대한 포인트 간 차이입니다. 신용 / 복사 askforprogram.in , 여기에 언급되지 않은 코드 예제 링크를 따르십시오.

  1. MVC의 ViewData

    • ViewData는 ControllerBase 클래스의 속성입니다.
    • ViewData는 사전 개체 유형입니다.
    • ViewData는 키-값 사전 컬렉션입니다.
    • ViewData는 MVC 1.0 버전에서 도입되었습니다.
    • ViewData는 .Net framework 3.5 이상에서 작동합니다.
    • 열거하는 동안 코드의 유형 변환을 수행해야합니다.
    • ViewData 객체는 현재 요청에 대해서만 데이터를 유지합니다.
  2. MVC의 ViewBag

    • ViewBag는 ControllerBase 클래스의 속성입니다.
    • ViewBag는 동적 객체 유형입니다.
    • ViewBag는 객체 유형입니다.
    • ViewBag는 MVC 3.0 버전에서 도입되었습니다.
    • ViewBag는 .Net framework 4.0 이상에서 작동합니다.
    • ViewBag는 속성을 사용하고 처리하므로 열거하는 동안 유형 변환을 수행 할 필요가 없습니다.
    • ViewBag 개체는 현재 요청에 대해서만 데이터를 유지합니다.
  3. MVC의 TempData

    • TempData는 ControllerBase 클래스의 속성입니다.
    • TempData는 사전 개체 유형입니다.
    • TempData는 키-값 사전 컬렉션입니다.
    • TempData는 MVC 1.0 버전에서 도입되었습니다.
    • TempData는 .Net framework 3.5 이상에서 작동합니다.
    • 열거하는 동안 코드의 유형 변환을 수행해야합니다.
    • TempData 객체는 현재 요청과 후속 요청 사이의 데이터에 사용됩니다.
  4. MVC 세션

    • 세션은 Controller (Abstract Class)의 속성입니다.
    • 세션은 HttpSessionStateBase의 유형입니다.
    • 세션은 키-값 사전 컬렉션입니다.
    • 세션은 MVC 1.0 버전에서 도입되었습니다.
    • TempData는 .Net framework 1.0 이상에서 작동합니다.
    • 열거하는 동안 코드의 유형 변환을 수행해야합니다.
    • 세션 개체는 모든 요청에 ​​대한 데이터를 유지합니다. 모든 요청에 ​​유효하며 만료되지 않습니다.

1

한 형식을 다른 형식보다 선택하는 데 기술적 이점이 없을 수도 있지만 두 구문의 중요한 차이점을 알고 있어야합니다. 한 가지 명백한 차이점은 ViewBag가 액세스하는 키가 유효한 C # 식별자 인 경우에만 작동한다는 것입니다. 예를 들어 ViewData [ "Key With Spaces"]에 값을 배치하면 코드가 컴파일되지 않으므로 ViewBag를 사용하여 해당 값에 액세스 할 수 없습니다. 고려해야 할 또 다른 주요 문제는 확장 메서드에 매개 변수로 동적 값을 전달할 수 없다는 것입니다. C # 컴파일러는 올바른 확장 방법을 선택하기 위해 컴파일시 모든 매개 변수의 실제 유형을 알아야합니다. 동적 매개 변수가 있으면 컴파일이 실패합니다. 예를 들어이 코드는 항상 실패합니다 : @ Html.TextBox ( "name", ViewBag.Name). 이 문제를 해결하려면 ViewData [ "Name"


0
public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

In View:

@ViewBag.Name 
@ViewData["Name"] 

0

이 방법으로 값을 사용하여 TEMP DATA를 사용하여 컨트롤러 사이의 정보를 다른 페이지로 전달할 수 있습니다.


0

ViewData와 ViewBag의 주요 차이점은 다음과 같습니다.

ViewData : 객체를 반환합니다. 이에 할당 한 내용은 중요하지 않으며 원래 유형으로 다시 유형 변환해야합니다.

ViewBag : 간단한 유형 (int, string 등) 또는 복잡한 유형을 할당 한 날씨와 상관없이 할당 된 정확한 유형을 반환하는 것이 똑똑합니다.

예 : 컨트롤러 코드.

 namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Products p1 = new Products();
            p1.productId = 101;
            p1.productName = "Phone";
            Products p2 = new Products();
            p2.productId = 102;
            p2.productName = "laptop";

            List<Products> products = new List<Products>();
            products.Add(p1);
            products.Add(p2);
            ViewBag.Countries = products;
            return View();
        }
    }
    public class Products
    {
        public int productId { get; set; }
        public string productName { get; set; }
    }
}

코드보기

<ul>
            @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
            {
            <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
            }
        </ul>

출력 화면.

여기에 이미지 설명을 입력하십시오


0

데이터보기

  1. ViewData는 컨트롤러에서보기로 데이터를 전달하는 데 사용됩니다.
  2. ViewData는 ViewDataDictionary 클래스에서 파생되며 기본적으로 Dictionary 개체 즉, 키는 문자열이고 값은 개체입니다.
  3. Object 유형의 데이터로 인해 ViewData에서 데이터를 검색하는 동안 데이터 typcasting이 필요하며 유형 캐스팅에 대해 null vvalue 확인이 없으면 응용 프로그램이 중단됩니다. 리디렉션이 발생하면 해당 값이 null이됩니다. TempData ViewData와 View Bag의 전체 차이를 읽습니다.

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html


0
ViewData
  1. ViewData는 컨트롤러에서보기로 데이터를 전달하는 데 사용됩니다.
  2. ViewDataDictionary 클래스에서 파생됩니다.
  3. 현재 요청에만 사용할 수 있습니다
  4. 복잡한 데이터 유형에 대한 유형 변환이 필요하고 오류를 피하기 위해 null 값을 확인합니다.
  5. 리디렉션이 발생하면 해당 값이 null이됩니다.
ViewBag
  1. ViewBag는 또한 컨트롤러에서 해당 뷰로 데이터를 전달하는 데 사용됩니다.
  2. ViewBag는 C # 4.0의 새로운 동적 기능을 활용하는 동적 속성입니다.
  3. 현재 요청에만 사용할 수 있습니다
  4. 리디렉션이 발생하면 해당 값이 null이됩니다.
  5. 복잡한 데이터 유형에 대한 유형 변환이 필요하지 않습니다.

0

여기서 ViewDataViewBag는 모두 Controller 에서 View로 데이터를 전달하는 데 사용됩니다 .

1. ViewData

-ViewData는 ViewDataDictonary 클래스 에서 파생 된 사전 개체입니다 .

-데이터는 하나의 요청 만 허용하며 페이지 리디렉션이 발생하면 ViewData 값이 지워집니다.

-ViewData 값은 사용하기 전에 cate로 입력해야합니다.

예 : 컨트롤러에서

public ActionResult PassingDatatoViewWithViewData()
{
      ViewData["Message"] = "This message shown in view with the ViewData";
      return View();
}

보기에서

@ViewData["Message"];

-ViewData는 KeyValue 와 같은 쌍 이고 Message는 Key이고 역 쉼표 값은 Value입니다.

-데이터가 단순하므로 데이터가 복잡한 경우 유형 변환을 사용하는 경우 여기에서 유형 변환을 사용할 수 없습니다.

public ActionResult PassingDatatoViewWithViewData()
{
      var type= new List<string>
    {
        "MVC",
        "MVP",
        "MVVC"
    };
    ViewData["types"] = type;
    return View();
}

-In View 데이터는 다음과 같이 추출 될 수 있습니다

<ul>
        @foreach (var items in (List<string>)ViewData["types"])
        {
         <li>@items</li>
        }
  </ul>

2. ViewBag

--ViewBag는 동적 기능을 사용합니다.

-ViewBag 유형 캐스팅이 필요합니다.

-리디렉션이 발생하면 ViewData와 동일합니다. 값이 null이됩니다.

예:

public ActionResult PassingDatatoViewWithViewBag()
{
          ViewData.Message = "This message shown in view with the ViewBag";
          return View();
}

보기에서

@ViewBag.vbMessage

복잡한 유형의 경우 ViewBag 사용

public ActionResult PassingDatatoViewWithViewBag()
{
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewBag.types = type;
        return View();
 }

-In View 데이터는 다음과 같이 추출 될 수 있습니다

<ul>
       @foreach (var items in ViewBag.types)
       {
         <li>@items</li>
       }
</ul>

-주요 차이점은 ViewBag 는 타입 캐스팅이 필요 하지 않지만 ViewData 는 타입 캐스팅이 필요하다는 것입니다.


-1

ViewBag와 ViewData는 컨트롤러에서 ASP.Net MVC로보기 위해 정보를 전달하는 데 사용되는 두 가지 수단입니다. 두 메커니즘을 모두 사용하는 목적은 컨트롤러와보기 사이의 통신을 제공하는 것입니다. 둘 다 리디렉션이 발생하면 즉, 페이지가 소스 페이지 (ViewBag 또는 ViewData의 값을 설정 한 위치)에서 대상 페이지로 리디렉션되면 (ViewBag 및 ViewData 모두) 수명이 짧습니다. null이된다

이러한 유사점에도 불구하고 (ViewBag와 ViewData)는 두 가지 구현에 대해 이야기하면 두 가지 다른 점이 있습니다. 차이점은 다음과 같습니다.

1.) 두 구현을 현명하게 분석하면 ViewData가 사전 데이터 구조라는 것을 알 수 있습니다. ViewDataDictionary에서 파생되고 ViewBag가 C # 4.0에 도입 된 동적 기능을 사용하는 동안 ViewBag는 이러한 값에 대한 키로 문자열을 사용하여 액세스 할 수 있습니다 동적 속성입니다.

2.) ViewData 형식의 값에 액세스하는 동안 ViewData 사전에 Object로 저장되어있는 값 (데이터 유형)을 타입 캐스트해야하지만 ViewBag의 경우 값에 액세스하는 경우에는 필요하지 않습니다.

3.) ViewBag에서 다음과 같이 값을 설정할 수 있습니다.

      ViewBag.Name = "Value"; 

다음과 같이 액세스 할 수 있습니다.

          @ViewBag.Name

ViewData의 경우 다음과 같이 값을 설정하고 액세스 할 수 있습니다. ViewData를 다음과 같이 설정합니다.

ViewData["Name"] = "Value";

이 같은 가치에 접근

 @ViewData["Name"] 

자세한 내용은 여기를 클릭하십시오 :


2
유감스럽게 생각하지만이 답변에는 유용한 내용이 없습니다. 허용 대답에서 누락 유용한 것은 문장 것 내가 배운하는 "viewbag은을 ViewData 주위에 동적 래퍼입니다" rachelappel.com/...
크리스 F 캐롤을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.