ASP.NET MVC는 어떻게 ViewBag
작동합니까? MSDN은 그것이 Object
나를 흥미롭게 하는 단지라고 말합니다. ViewBag.Foo
그리고 매직 스트링과 같은 “매직”속성은 ViewBag["Hello"]
실제로 어떻게 작동합니까?
또한 ASP.NET WebForms 앱에서 어떻게 만들어서 사용할 수 있습니까?
예는 정말 감사하겠습니다!
답변
ViewBag
유형 dynamic
이지만 내부적으로System.Dynamic.ExpandoObject()
다음과 같이 선언됩니다.
dynamic ViewBag = new System.Dynamic.ExpandoObject();
이것이 당신이 할 수있는 이유입니다 :
ViewBag.Foo = "Bar";
샘플 확장기 개체 코드 :
public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider
{
public Dictionary<string, object> objectDictionary;
public ExpanderObject()
{
objectDictionary = new Dictionary<string, object>();
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
object val;
if (objectDictionary.TryGetValue(binder.Name, out val))
{
result = val;
return true;
}
result = null;
return false;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
try
{
objectDictionary[binder.Name] = value;
return true;
}
catch (Exception ex)
{
return false;
}
}
}
답변
이것은 동적 개체입니다. 즉, 컨트롤러에서 속성을 추가하고 나중에보기에서 읽을 수 있습니다. 기본적으로 동적 유형의 기능인 개체를 만드는 것처럼 만들기 때문입니다. 역학에 대한 이 MSDN 문서 를 참조하십시오 . MVC와 관련된 사용법에 대해서는 이 기사 를 참조하십시오 .
웹 양식에 이것을 사용하려면 다음과 같이 기본 페이지 클래스에 동적 속성을 추가합니다.
public class BasePage : Page
{
public dynamic ViewBagProperty
{
get;
set;
}
}
여기에서 모든 페이지를 상속 받으십시오. ASP.NET 태그에서 다음을 수행 할 수 있어야합니다.
<%= ViewBagProperty.X %>
작동합니다. 그렇지 않은 경우 해결 방법이 있습니다.
답변
는 ViewBag
이 System.Dynamic.ExpandoObject
같은 제안했다. 의 속성 ViewBag
은 기본적으로 KeyValue
쌍이며 키로 값에 액세스합니다. 이러한 의미에서 이들은 동일합니다.
ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";
답변
ViewBag는 전달되는 데이터를 렌더링하기 위해 컨트롤러 작업에서보기로 데이터를 전달하는 데 사용됩니다. 이제 ViewBag 또는 ViewData를 사용하여 Controller Action과 View간에 데이터를 전달할 수 있습니다. ViewBag : 동적 개체의 유형입니다. 즉, 뷰백에 새 필드를 동적으로 추가하고 뷰에서 이러한 필드에 액세스 할 수 있습니다. 새로운 필드를 생성 할 때 viewbag의 객체를 초기화해야합니다.
예 : 1. ViewBag 생성 : ViewBag.FirstName = “John”;
- 보기 액세스 : @ ViewBag.FirstName.
답변
ViewBag는 동적 유형입니다. 더 이상 할 수 없습니다 ViewBag["Foo"]
. 예외가 발생 합니다. ‘System.Dynamic.DynamicObject’유형의 식에 []를 사용하여 인덱싱을 적용 할 수 없습니다 .
의 내부 구현은 ViewBag
실제로 Foo를 ViewData["Foo"]
(ViewDataDictionary 유형)에 저장 하므로 두 개는 서로 바꿔서 사용할 수 있습니다. ViewData["Foo"]
및 ViewBag.Foo
.
그리고 범위. ViewBag와 ViewData는 Controller의 Action과 View간에 데이터를 전달하는 역할을합니다.
답변
ViewBag는 동적으로 값을 설정하거나 가져올 수있는 동적 유형이며 강력한 유형의 클래스없이 추가 필드를 추가 할 수 있습니다. 컨트롤러에서보기로 데이터를 전달할 수 있습니다. 컨트롤러에서 ……
public ActionResult Index()
{
ViewBag.victor = "My name is Victor";
return View();
}
보기
@foreach(string a in ViewBag.victor)
{
.........
}
내가 배운 것은 둘 다 Save dynamic name 속성 즉 ViewBag.victor가 있어야한다는 것입니다.
답변
public dynamic ViewBag
{
get
{
if (_viewBag == null)
{
_viewBag = new DynamicViewData(() => ViewData);
}
return _viewBag;
}
}