태그 보관물: difference

difference

ViewData와 ViewBag의 차이점은 무엇입니까? ViewDataMVC 2 와는 어떻게 다릅니

ViewBagMVC 3에서 봤습니다. ViewDataMVC 2 와는 어떻게 다릅니 까?



답변

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

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

ViewData["Foo"]

마법 속성 :

ViewBag.Foo

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

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

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


답변

내부적으로 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 속성으로 명명되었습니다.)


답변

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"]


답변

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>


답변

모든 답변은 제안 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"]


답변

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

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

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

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


답변

ViewData와 ViewBag를보기와 약간 다른 방식으로 사용할 수 있다는 미묘한 차이점이 있습니다. 한 가지 장점은이 게시물에 설명되어 http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx 와 쇼가 캐스팅 예제에서 ViewData 대신 ViewBag를 사용하면 피할 수 있습니다.