ASP.NET MVC의 ViewBag 작동 방식


102

ASP.NET MVC는 어떻게 ViewBag작동합니까? MSDN은 그것이 Object나를 흥미롭게 하는 단지라고 말합니다. ViewBag.Foo그리고 매직 스트링과 같은 "매직"속성은 ViewBag["Hello"]실제로 어떻게 작동합니까?

또한 ASP.NET WebForms 앱에서 어떻게 만들어서 사용할 수 있습니까?

예는 정말 감사하겠습니다!


페이지가 이미 파일 뒤에있는 코드의 변수에 직접 액세스 할 수 있으므로 WebForms에서는 개념이 필요하지 않은 것 같습니다. MVC에서 뷰는 ViewBag 또는 Model에서 전달되는 데이터를 제외하고 컨트롤러의 어떤 것도 액세스 할 수 없습니다.
Richard Dalton

답변:


91

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

1
이상한 것을 그냥 말한다 public object ViewBag { get; }ViewBag에 대한 MSDN 페이지에서 ,하지만 난 그것의 것을 청구 구입하고있어 ExpandoObject . 나는 여기에 ViewData와의 비교를 좋아한다 : " 그래서 기본적으로 [ViewBag]는 [ViewData에서] 매직 문자열을 ... 매직 속성으로 대체한다 ". ^)
러핀

그것이 말하는 것을 이상하게 이상한 @ruffin public object ViewBag { get; }MSDN에, 코드는 그것의 말한다 dynamic ViewBag { get .. 내부적 타입의 인 DynamicViewData
아니 켓 인게

아주 좋아 . 찾아 주셔서 감사합니다. 그리고 나는 +1하고 당신을 믿었다 고 말했습니다! ^)
러핀

2
또 다른 경우를 @ruffin 때 문서 거짓말과 코드 결코 거짓말
아니 켓 인게

때로는 명확하지 않거나 혼합 된 질문에 대한 올바른 답을 찾을 때 감명을받습니다. 감사!
Oscar Ortiz

33

이것은 동적 개체입니다. 즉, 컨트롤러에서 속성을 추가하고 나중에보기에서 읽을 수 있습니다. 기본적으로 동적 유형의 기능인 개체를 만드는 것처럼 만들기 때문입니다. 역학에 대한 이 MSDN 문서 를 참조하십시오 . MVC와 관련된 사용법에 대해서는 이 기사 를 참조하십시오 .

웹 양식에 이것을 사용하려면 다음과 같이 기본 페이지 클래스에 동적 속성을 추가합니다.

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

여기에서 모든 페이지를 상속 받으십시오. ASP.NET 태그에서 다음을 수행 할 수 있어야합니다.

<%= ViewBagProperty.X %>

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


ViewBag가 무엇인지 알고 있습니다. WebForms에서 객체를 만드는 방법을 알고 싶습니다. 즉, 직접 코딩하고 싶습니다.
Aniket Inge 2013

구현으로 위에서 업데이트되었습니다.
Brian Mains

8

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

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

ViewBag가 무엇인지 알고 있습니다. WebForms에서 객체를 만드는 방법을 알고 싶습니다. 즉, 직접 코딩하고 싶습니다.
Aniket Inge 2013

@Aniket 웹 양식에 ViewState가 있습니다.
Konstantin Dinev 2013

5

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

예 : 1. ViewBag 생성 : ViewBag.FirstName = "John";

  1. 보기 액세스 : @ ViewBag.FirstName.

3

ViewBag는 동적 유형입니다. 더 이상 할 수 없습니다 ViewBag["Foo"]. 예외가 발생 합니다. 'System.Dynamic.DynamicObject'유형의 식에 []를 사용하여 인덱싱을 적용 할 수 없습니다 .

의 내부 구현은 ViewBag실제로 Foo를 ViewData["Foo"](ViewDataDictionary 유형)에 저장 하므로 두 개는 서로 바꿔서 사용할 수 있습니다. ViewData["Foo"]ViewBag.Foo.

그리고 범위. ViewBag와 ViewData는 Controller의 Action과 View간에 데이터를 전달하는 역할을합니다.


0

ViewBag는 동적으로 값을 설정하거나 가져올 수있는 동적 유형이며 강력한 유형의 클래스없이 추가 필드를 추가 할 수 있습니다. 컨트롤러에서보기로 데이터를 전달할 수 있습니다. 컨트롤러에서 ......

public ActionResult Index()
{
    ViewBag.victor = "My name is Victor";
    return View();
}

보기

@foreach(string a in ViewBag.victor)
{
     .........
}

내가 배운 것은 둘 다 Save dynamic name 속성 즉 ViewBag.victor가 있어야한다는 것입니다.


-1
public dynamic ViewBag
{
    get
    {
        if (_viewBag == null)
        {
            _viewBag = new DynamicViewData(() => ViewData);
        }

        return _viewBag;
    }
}

3
공유 한 코드에 대한 컨텍스트 / 설명을 추가해 주시기 바랍니다. 질문자 및 다른 미래 독자가 귀하의 게시물을 더 잘 이해하는 데 도움이 될 것입니다.
RBT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.