[asp.net] ASP.NET MVC의 ViewBag 작동 방식

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 %>

작동합니다. 그렇지 않은 경우 해결 방법이 있습니다.


답변

ViewBagSystem.Dynamic.ExpandoObject같은 제안했다. 의 속성 ViewBag은 기본적으로 KeyValue쌍이며 키로 값에 액세스합니다. 이러한 의미에서 이들은 동일합니다.

ViewBag.Foo = "Bar";
ViewBag["Foo"] = "Bar";


답변

ViewBag는 전달되는 데이터를 렌더링하기 위해 컨트롤러 작업에서보기로 데이터를 전달하는 데 사용됩니다. 이제 ViewBag 또는 ViewData를 사용하여 Controller Action과 View간에 데이터를 전달할 수 있습니다. ViewBag : 동적 개체의 유형입니다. 즉, 뷰백에 새 필드를 동적으로 추가하고 뷰에서 이러한 필드에 액세스 할 수 있습니다. 새로운 필드를 생성 할 때 viewbag의 객체를 초기화해야합니다.

예 : 1. ViewBag 생성 : ViewBag.FirstName = “John”;

  1. 보기 액세스 : @ 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;
    }
}