IT story

ViewBag, ViewData 및 TempData

hot-time 2020. 5. 5. 19:37
반응형

ViewBag, ViewData 및 TempData


언제 어떤 신체가 설명해야할까요?

  1. TempData
  2. ViewBag
  3. ViewData

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

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

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

감사


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

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


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

The last mechanism is the Session which work like the ViewData, like a Dictionary that take a string for key and object for value. This one is stored into the client Cookie and can be used for a much more long time. It also need more verification to never have any confidential information. Regarding ViewData or ViewBag you should use it intelligently for application performance. Because each action goes through the whole life cycle of regular asp.net mvc request. You can use ViewData/ViewBag in your child action but be careful that you are not using it to populate the unrelated data which can pollute your controller.


TempData

Basically it's like a DataReader, once read, data will be lost.

Check this Video

Example

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

If you pay attention to the above code, RedirectToAction has no impact over the TempData until TempData is read. So, once TempData is read, values will be lost.

How can i keep the TempData after reading?

Check the output in Action Method Test 1 and Test 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();
    }
}

If you pay attention to the above code, data is not lost after RedirectToAction as well as after Reading the Data and the reason is, We are using TempData.Keep(). is that

In this way you can make it persist as long as you wish in other controllers also.

ViewBag/ViewData

The Data will persist to the corresponding View


TempData in Asp.Net MVC is one of the very useful feature. It is used to pass data from current request to subsequent request. In other words if we want to send data from one page to another page while redirection occurs, we can use TempData, but we need to do some consideration in code to achieve this feature in MVC. Because the life of TempData is very short and lies only till the target view is fully loaded. But, we can use Keep() method to persist data in TempData.

Read More


ViewBag, ViewData, TempData and View State in MVC

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

ASP.NET MVC offers us three options ViewData, VieBag and TempData for passing data from controller to view and in next request. ViewData and ViewBag are almost similar and TempData performs additional responsibility.

Similarities between ViewBag & ViewData :

Helps to maintain data when you move from controller to view. Used to pass data from controller to corresponding view. Short life means value becomes null when redirection occurs. This is because their goal is to provide a way to communicate between controllers and views. It’s a communication mechanism within the server call.

Difference between ViewBag & ViewData:

ViewData is a dictionary of objects that is derived from ViewDataDictionary class and accessible using strings as keys. ViewBag is a dynamic property that takes advantage of the new dynamic features in C# 4.0. ViewData requires typecasting for complex data type and check for null values to avoid error. ViewBag doesn’t require typecasting for complex data type.

ViewBag & ViewData Example:

public ActionResult Index()

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

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

In View, we call like below:

@ViewBag.Name   
@ViewData["Name"]

TempData:

Helps to maintain data when you move from one controller to other controller or from one action to other action. In other words when you redirect, “Tempdata” helps to maintain data between those redirects. It internally uses session variables. TempData is meant to be a very short-lived instance, and you should only use it during the current and the subsequent requests only

The only scenario where using TempData will reliably work is when you are redirecting. This is because a redirect kills the current request (and sends HTTP status code 302 Object Moved to the client), then creates a new request on the server to serve the redirected view.

It requires typecasting for complex data type and check for null values to avoid error.

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

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
    } 

TempData will be always available until first read, once you read it its not available any more can be useful to pass quick message also to view that will be gone after first read. ViewBag Its more useful when passing quickly piece of data to the view, normally you should pass all data to the view through model , but there is cases when you model coming direct from class that is map into database like entity framework in that case you don't what to change you model to pass a new piece of data, you can stick that into the viewbag ViewData is just indexed version of ViewBag and was used before MVC3


Also the scope is different between viewbag and temptdata. viewbag is based on first view (not shared between action methods) but temptdata can be shared between an action method and just one another.

참고URL : https://stackoverflow.com/questions/7993263/viewbag-viewdata-and-tempdata

반응형