ViewBag, ViewData 및 TempData


209

어떤 신체가 언제 사용 해야하는지 설명 할 수 있습니까?

  1. TempData
  2. ViewBag
  3. ViewData

컨트롤러 1에서 값을 설정 해야하는 경우 컨트롤러가 컨트롤러 2로 리디렉션되고 컨트롤러 2 가보기를 렌더링해야한다는 요구 사항이 있습니다.

ViewBag를 사용하려고했는데 컨트롤러 2에 도달하면 값이 손실됩니다.

사용시기와 장점 또는 단점을 알 수 있습니까?

감사


5
이것은 차이점을 설명하는 훌륭한 게시물입니다.
Beku

1
stackoverflow.com/a/17199709/2015869
Imad Alazani 2016 년

답변:


293

1) 온도 데이터

리디렉션 동안 유지 될 데이터를 저장할 수 있습니다. 내부적으로 세션을 백업 저장소로 사용하며, 리디렉션 후 데이터가 자동으로 제거됩니다. 패턴은 다음과 같습니다.

public ActionResult Foo()
{
    // store something into the tempdata that will be available during a single redirect
    TempData["foo"] = "bar";

    // you should always redirect if you store something into TempData to
    // a controller action that will consume this data
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var foo = TempData["foo"];
    ...
}

2) ViewBag, ViewData

해당보기에서 사용될 컨트롤러 작업에 데이터를 저장할 수 있습니다. 이것은 액션이 뷰를 반환하고 리디렉션하지 않는다고 가정합니다. 현재 요청 중에 만 산다.

패턴은 다음과 같습니다.

public ActionResult Foo()
{
    ViewBag.Foo = "bar";
    return View();
}

그리고보기에서 :

@ViewBag.Foo

또는 ViewData로 :

public ActionResult Foo()
{
    ViewData["Foo"] = "bar";
    return View();
}

그리고보기에서 :

@ViewData["Foo"]

ViewBag동적 래퍼 일 ViewData뿐이며 ASP.NET MVC 3에만 있습니다.

이 두 가지 구조 중 어느 것도 사용해서는 안됩니다. 뷰 모델과 강력한 형식의 뷰를 사용해야합니다. 올바른 패턴은 다음과 같습니다.

모델보기 :

public class MyViewModel
{
    public string Foo { get; set; }
}

동작:

public Action Foo()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

강력하게 입력 된보기 :

@model MyViewModel
@Model.Foo

이 간단한 소개 후에 질문에 대답하겠습니다.

내 요구 사항은 컨트롤러 하나에서 값을 설정하고 싶습니다. 컨트롤러는 ControllerTwo로 리디렉션되고 Controller2는보기를 렌더링합니다.

public class OneController: Controller
{
    public ActionResult Index()
    {
        TempData["foo"] = "bar";
        return RedirectToAction("index", "two");
    }
}

public class TwoController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Foo = TempData["foo"] as string
        };
        return View(model);
    }
}

해당보기 ( ~/Views/Two/Index.cshtml) :

@model MyViewModel
@Html.DisplayFor(x => x.Foo)

TempData 사용의 단점도 있습니다. 사용자가 대상 페이지에서 F5를 누르면 데이터가 손실됩니다.

개인적으로 TempData도 사용하지 않습니다. 내부적으로 세션을 사용하고 응용 프로그램에서 세션을 비활성화하기 때문입니다. 나는 이것을 달성하기 위해보다 RESTful 한 방법을 선호합니다. 리디렉션을 수행하는 첫 번째 컨트롤러 작업에서 데이터 저장소에 객체를 저장하고 리디렉션 할 때 생성 된 고유 ID를 사용합니다. 그런 다음 대상 작업에서이 ID를 사용하여 처음 저장된 객체를 다시 가져옵니다.

public class OneController: Controller
{
    public ActionResult Index()
    {
        var id = Repository.SaveData("foo");
        return RedirectToAction("index", "two", new { id = id });
    }
}

public class TwoController: Controller
{
    public ActionResult Index(string id)
    {
        var model = new MyViewModel
        {
            Foo = Repository.GetData(id)
        };
        return View(model);
    }
}

보기는 동일하게 유지됩니다.


57
대단한 대답이지만, "그 두 가지 구조 중 어느 것도 사용해서는 안된다"는 독단적 인 진술에 동의하지 않습니다. ViewBag에 대한 몇 가지 합법적 인 사용법을 발견했습니다. 예를 들어 기본 뷰 파일에 ViewBag.Title사용되는 모든 뷰에 속성을 설정했습니다 _Layout.cshtml. 내가 사용하는 또 다른 경우는 정보 메시지 (예 : "제품이 성공적으로 저장되었습니다!")를 사용자에게 제공하는 것입니다. Layout.cshtml제공된 경우 메시지를 렌더링하기 위해 몇 가지 일반적인 마크 업을 배치했으며이를 통해 ViewBag.Message모든 작업에서 설정할 수 있습니다 . 두 경우 모두에 ViewModel 속성을 사용하면 단점이 너무 많습니다.
Jesse Webb

22
나는 제시와 동의해야 할 것이다. 이것은 훌륭한 설명이지만, ViewBag를 사용해야 할 이유가 없다고 솔직히 말하면 사실은 문제가 아닙니다. ViewBag를 과도하게 사용하는 것은 확실히 나쁜 습관이며 일부 개발자는이 함정에 빠지지만 강력하게 사용됩니다.
Ron DeFreitas

1
@ ron.defreitas, 알았어, 왜 당신이 사용해야 할 좋은 이유 하나를 말해줘 ViewBag. ViewBag에서 일부 실제 시나리오를 설명하십시오. 당신이 것을 말하고 있기 때문에, 내가 인용 강력한 자원을 , 난 당신이 몇 가지 구체적인 사례가 추측 강력한 자원 이다 강력한 . 나는 내 경력에 사용한 적이 없기 때문에 사람들이이 강력한 무기 를 어떻게 사용하는지 배우게되어 매우 기쁠 것 입니다.
Darin Dimitrov

27
여기에 엘리트가 있습니다. 다린, 제시는 그러한 예 중 하나를 구체적으로 언급했다. 일을하는 다른 방법이 항상 있기 때문에 그 유용성을 자동으로 부정하지는 않습니다.
Djentleman

2
@DarinDimitrov : 속성 메소드 내에서 뷰에 일부 정보를 전달 해야하는 시나리오가 있습니다. filterContext.Controller.ViewData를 사용하면 강력한 형식의 뷰에 전달하는 것보다 훨씬 쉽습니다. 즉, 설명해 주셔서 감사합니다. 매우 유용했습니다.
Andy

15

ASP.NET MVC는 컨트롤러에서 데이터를 다음 요청으로 전달하기 위해 ViewData, ViewBag 및 TempData의 세 가지 옵션을 제공합니다. ViewData와 ViewBag는 거의 비슷하며 TempData는 추가 책임을 수행합니다. 이 세 가지 객체에 대해 토론하거나 주요 요점을 알아 봅니다.

ViewBag와 ViewData의 유사점 :

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

ViewBag와 ViewData의 차이점 :

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

ViewBag 및 ViewData 예 :

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


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

보기에서 :

@ViewBag.Name 
@ViewData["Name"] 

TempData :

TempData는 TempDataDictionary 클래스에서 파생 된 사전으로 단명 세션에 저장되며 문자열 키 및 개체 값입니다. 차이점은 개체의 수명주기입니다. TempData는 HTTP 요청 시간 동안 정보를 유지합니다. 이것은 한 페이지에서 다른 페이지로만 의미합니다. 이것은 동일한 HTTP 요청에 있기 때문에 302/303 리디렉션에서도 작동합니다. 한 컨트롤러에서 다른 컨트롤러로 또는 한 작업에서 다른 작업으로 이동할 때 데이터를 유지 관리하는 데 도움이됩니다. 다시 말해, 리디렉션 할 때 "TempData"는 이러한 리디렉션간에 데이터를 유지 관리하는 데 도움이됩니다. 내부적으로 세션 변수를 사용합니다. 현재 및 후속 요청 중 임시 데이터 사용은 다음 요청이 다음보기로 리디렉션 될 것임을 확신 할 때만 사용됨을 의미합니다. 복잡한 데이터 유형에 대한 유형 변환이 필요하며 오류를 피하기 위해 null 값을 확인하십시오.

public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}

마지막 메커니즘은 ViewData처럼 작동하는 Session입니다. 키와 문자열을 값으로받는 Dictionary와 같은 Dictionary입니다. 이 쿠키는 클라이언트 쿠키에 저장되며 훨씬 더 오랫동안 사용할 수 있습니다. 또한 기밀 정보를 갖지 않으려면 더 많은 검증이 필요합니다. ViewData 또는 ViewBag와 관련하여 애플리케이션 성능에 지능적으로 사용해야합니다. 각 작업은 정규 asp.net mvc 요청의 전체 수명주기를 거치기 때문입니다. 자식 작업에서 ViewData / ViewBag를 사용할 수 있지만 컨트롤러를 오염시킬 수있는 관련없는 데이터를 채우는 데 사용하지 않도록주의하십시오.


11

TempData

기본적으로 DataReader와 비슷하며 일단 읽은 후에는 데이터가 손실됩니다.

이 비디오를 확인

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        String str = TempData["T"]; //Output - T
        return View();
    }
}

위 코드에주의를 기울이면 TempData를 읽을 때까지 RedirectToAction이 TempData에 영향을 미치지 않습니다. 따라서 TempData를 읽으면 값이 손실됩니다.

읽은 후 TempData를 어떻게 유지합니까?

조치 방법 테스트 1 및 테스트 2의 출력 확인

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        string Str = Convert.ToString(TempData["T"]);
        TempData.Keep(); // Keep TempData
        return RedirectToAction("Test2");
    }

    public ActionResult Test2()
    {
        string Str = Convert.ToString(TempData["T"]); //OutPut - T
        return View();
    }
}

위 코드에주의를 기울이면 RedirectToAction 이후와 데이터를 읽은 후에도 데이터가 손실되지 않으며 그 이유는 다음을 사용하는 것 TempData.Keep()입니다. 그게

이런 식으로 다른 컨트롤러에서도 원하는 한 지속될 수 있습니다.

ViewBag / ViewData

데이터는 해당보기로 유지됩니다


4

Asp.Net MVC의 TempData는 매우 유용한 기능 중 하나입니다. 현재 요청에서 후속 요청으로 데이터를 전달하는 데 사용됩니다. 다시 말해, 리디렉션이 발생하는 동안 한 페이지에서 다른 페이지로 데이터를 보내려면 TempData를 사용할 수 있지만 MVC에서이 기능을 달성하려면 코드를 고려해야합니다. TempData의 수명이 매우 짧고 대상 뷰가 완전히로드 될 때까지만 있기 때문입니다. 그러나 Keep () 메서드를 사용하여 TempData에 데이터를 유지할 수 있습니다.

더 읽어보기


3

MVC의 ViewBag, ViewData, TempData 및 View State

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

ASP.NET MVC는 컨트롤러에서 데이터를 다음 요청으로 전달하기 위해 ViewData, VieBag 및 TempData의 세 가지 옵션을 제공합니다. ViewData와 ViewBag는 거의 비슷하며 TempData는 추가 책임을 수행합니다.

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

View에서는 다음과 같이 호출합니다.

@ViewBag.Name   
@ViewData["Name"]

TempData :

한 컨트롤러에서 다른 컨트롤러로 또는 한 작업에서 다른 작업으로 이동할 때 데이터를 유지 관리하는 데 도움이됩니다. 다시 말해 리디렉션 할 때 "Tempdata"는 이러한 리디렉션간에 데이터를 유지 관리하는 데 도움이됩니다. 내부적으로 세션 변수를 사용합니다. TempData는 수명이 매우 짧은 인스턴스이므로 현재 요청과 후속 요청 중에 만 사용해야합니다.

TempData를 사용하면 안정적으로 작동하는 유일한 시나리오는 리디렉션하는 경우입니다. 리디렉션이 현재 요청을 종료하고 HTTP 상태 코드 302 개체를 클라이언트로 이동 한 다음 서버에서 리디렉션 된보기를 제공하기 위해 새 요청을 생성하기 때문입니다.

복잡한 데이터 유형에 대한 유형 변환이 필요하며 오류를 피하기 위해 null 값을 확인하십시오.

public ActionResult Index()
{   
   var model = new Review()  
   {  
      Body = "Start",  
      Rating=5  
   };  

    TempData["ModelName"] = model;    
    return RedirectToAction("About");   
} 

public ActionResult About()       
{  
    var model= TempData["ModelName"];  
    return View(model);   
}  

1
void Keep()

Calling this method with in the current action ensures that all the items in TempData are not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep(); // retains all strings values
    } 

void Keep(string key)

Calling this method with in the current action ensures that specific item in TempData is not removed at the end of the current request.

    @model MyProject.Models.EmpModel;
    @{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "About";
    var tempDataEmployeet = TempData["emp"] as Employee; //need typcasting
    TempData.Keep("emp"); // retains only "emp" string values
    } 

1

TempData는 처음 읽을 때까지 항상 사용할 수 있습니다. 일단 읽은 후에는 더 이상 사용할 수 없습니다. 빠른 메시지를 전달하여 첫 번째 읽은 후에 사라지는 것을 볼 수 있습니다. ViewBag 데이터를 빠르게 뷰에 전달할 때 더 유용합니다. 일반적으로 모든 데이터를 model을 통해 뷰에 전달해야하지만 모델에서 직접 엔티티 프레임 워크와 같은 데이터베이스로 매핑되는 클래스에서 직접 모델을 가져 오는 경우가 있습니다. 새로운 데이터를 전달하기 위해 모델을 변경하는 것이 아니라 ViewBag에 ViewData를 붙여 넣을 수 있습니다. ViewData는 인덱스 버전의 ViewBag이며 MVC3 이전에 사용되었습니다.


0

또한 뷰 백과 temptdata의 범위가 다릅니다. viewbag은 첫 번째보기 (액션 메소드간에 공유되지 않음)를 기반으로하지만 temptdata는 조치 메소드와 서로간에 공유 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.