답변:
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 속성으로 명명되었습니다.)
ViewData
와 의 차이점을 묻습니다 . ViewBag
ViewModel
dynamic
지원합니다 ViewBag.Message
. 하나는 이전 ViewData["Message"]
구문을 사용 합니다.
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"]
typecasting
하지만 타입 캐스팅이 수행되는 방법을 보여주지 않았습니다
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>
<h4>@ViewBag.emp.Name</h4>
변경한다<h4>@ViewBag.Employee.Name</h4>
모든 답변은 제안 ViewBag
및 / 또는 ViewData
데이터를 전달하는 것입니다 Controller
에Views
잘못된 정보이다. 둘 다 뷰에서 레이아웃으로 또는 부분으로 뷰 (또는 ViewComponents 등)로 데이터를 전달하는 데 매우 유용합니다. 컨트롤러 전용이 아닙니다.
기본 asp.net 샘플이 레이아웃 페이지에 다음과 같이 있습니다.
<title>@ViewData["Title"] - MyApp</title>
그리고 어떤 관점에서
ViewData["Title"] = "Details";
그럼, 질문을에 "무슨 사이의 차이점 ViewBag
과ViewData
?"
가장 눈에 띄는 차이점은 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를 사용하면 피할 수 있습니다.
아래는 ViewData, ViewBag, TempData & Session에 대한 포인트 간 차이입니다. 신용 / 복사 askforprogram.in , 여기에 언급되지 않은 코드 예제 링크를 따르십시오.
MVC의 ViewData
MVC의 ViewBag
MVC의 TempData
MVC 세션
한 형식을 다른 형식보다 선택하는 데 기술적 이점이 없을 수도 있지만 두 구문의 중요한 차이점을 알고 있어야합니다. 한 가지 명백한 차이점은 ViewBag가 액세스하는 키가 유효한 C # 식별자 인 경우에만 작동한다는 것입니다. 예를 들어 ViewData [ "Key With Spaces"]에 값을 배치하면 코드가 컴파일되지 않으므로 ViewBag를 사용하여 해당 값에 액세스 할 수 없습니다. 고려해야 할 또 다른 주요 문제는 확장 메서드에 매개 변수로 동적 값을 전달할 수 없다는 것입니다. C # 컴파일러는 올바른 확장 방법을 선택하기 위해 컴파일시 모든 매개 변수의 실제 유형을 알아야합니다. 동적 매개 변수가 있으면 컴파일이 실패합니다. 예를 들어이 코드는 항상 실패합니다 : @ Html.TextBox ( "name", ViewBag.Name). 이 문제를 해결하려면 ViewData [ "Name"
이 방법으로 값을 사용하여 TEMP DATA를 사용하여 컨트롤러 사이의 정보를 다른 페이지로 전달할 수 있습니다.
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 @item.productName</li>
}
</ul>
출력 화면.
데이터보기
http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html
여기서 ViewData 와 ViewBag는 모두 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는 Key 및 Value 와 같은 쌍 이고 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 는 타입 캐스팅이 필요하다는 것입니다.
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"]
자세한 내용은 여기를 클릭하십시오 :