Cách ViewBag trong ASP.NET MVC hoạt động


102

ASP.NET MVC ViewBaghoạt động như thế nào? MSDN nói rằng nó chỉ là một Object, điều khiến tôi tò mò, làm thế nào mà các thuộc tính "Phép thuật" như ViewBag.Foovà chuỗi phép thuật ViewBag["Hello"]thực sự hoạt động?

Ngoài ra, làm cách nào tôi có thể tạo và sử dụng nó trong ứng dụng ASP.NET WebForms của mình?

Ví dụ sẽ thực sự được đánh giá cao!


Khái niệm này dường như không cần thiết trong WebForms vì trang đã có quyền truy cập trực tiếp vào các biến trong mã đằng sau tệp của nó. Trong khi đó trong MVC, chế độ xem không có quyền truy cập vào bất kỳ thứ gì trong bộ điều khiển ngoài dữ liệu được chuyển vào chế độ xem ViewBag hoặc Model.
Richard Dalton

Câu trả lời:


91

ViewBagthuộc loại dynamicnhưng, bên trong là mộtSystem.Dynamic.ExpandoObject()

Nó được khai báo như thế này:

dynamic ViewBag = new System.Dynamic.ExpandoObject();

đó là lý do tại sao bạn có thể làm:

ViewBag.Foo = "Bar";

Mã đối tượng Expander mẫu:

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
Kỳ lạ là nó chỉ thông báo public object ViewBag { get; }trên trang MSDN cho ViewBag , nhưng tôi đang mua khiếu nại của bạn rằng đó là mộtExpandoObject . Tôi thích sự so sánh với ViewData ở đây : " Vì vậy, về cơ bản [ViewBag] thay thế các chuỗi ma thuật [trong ViewData] ... bằng các thuộc tính ma thuật ". ; ^)
ruffin

@ruffin kì lạ lạ mà nó nói public object ViewBag { get; }trên MSDN, Mã nói của nó dynamic ViewBag { get .. mà trong nội bộ là loại DynamicViewData
Aniket Inge

Rất tốt . Cảm ơn vì đã đào lên. Và tôi đã +1 và nói rằng tôi tin bạn! ; ^)
ruffin

2
@ruffin một trường hợp khi những lời dối trá tài liệu và mã không bao giờ nói dối
Aniket Inge

Đôi khi tôi rất ấn tượng khi tìm ra câu trả lời đúng cho những câu hỏi không quá rõ ràng / hỗn hợp. Cảm ơn!
Oscar Ortiz

33

Đó là một đối tượng động, có nghĩa là bạn có thể thêm các thuộc tính vào nó trong bộ điều khiển và đọc chúng sau này trong dạng xem, vì về cơ bản bạn đang tạo đối tượng như cách bạn làm, một tính năng của kiểu động. Xem bài báo MSDN này về động lực học. Xem bài viết này về cách sử dụng nó liên quan đến MVC.

Nếu bạn muốn sử dụng điều này cho các biểu mẫu web, hãy thêm thuộc tính động vào một lớp trang cơ sở như sau:

public class BasePage : Page
{

    public dynamic ViewBagProperty
    {
        get;
        set;
    }
}

Có tất cả các trang của bạn kế thừa từ điều này. Bạn có thể, trong đánh dấu ASP.NET của mình, thực hiện:

<%= ViewBagProperty.X %>

Cần làm việc. Nếu không, có nhiều cách để giải quyết vấn đề đó.


Tôi biết ViewBag là gì, tôi muốn biết cách tạo một đối tượng như vậy trong WebForms, có nghĩa là tôi muốn viết mã nó.
Aniket Inge

Đã cập nhật ở trên với một triển khai.
Brian Mains

8

Đây ViewBaglà một System.Dynamic.ExpandoObjectnhư được đề xuất. Các thuộc tính trong về ViewBagcơ bản là các KeyValuecặp, nơi bạn truy cập giá trị bằng khóa. Theo nghĩa này, chúng tương đương:

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

Tôi biết ViewBag là gì, tôi muốn biết cách tạo một đối tượng như vậy trong WebForms, có nghĩa là tôi muốn viết mã nó.
Aniket Inge

@Aniket Bạn có ViewState ở dạng web.
Konstantin Dinev

5

ViewBag được sử dụng để truyền dữ liệu từ Hành động điều khiển đến chế độ xem để hiển thị dữ liệu đang được truyền. Bây giờ bạn có thể chuyển dữ liệu bằng cách sử dụng giữa Controller Action và View bằng cách sử dụng ViewBag hoặc ViewData. ViewBag: Đây là loại đối tượng Động, có nghĩa là bạn có thể thêm các trường mới vào túi xem động và truy cập các trường này trong Chế độ xem. Bạn cần khởi tạo đối tượng của viewbag tại thời điểm tạo trường mới.

ví dụ: 1. Tạo ViewBag: ViewBag.FirstName = "John";

  1. Truy cập Chế độ xem: @ ViewBag.FirstName.

3

ViewBag thuộc loại động. Nhiều hơn nữa, bạn không thể làm ViewBag["Foo"]. Bạn sẽ nhận được ngoại lệ - Không thể áp dụng lập chỉ mục với [] cho biểu thức kiểu 'System.Dynamic.DynamicObject' .

Việc triển khai nội bộ thực ViewBagsự lưu trữ Foo vào ViewData["Foo"](kiểu ViewDataDictionary), vì vậy 2 cái đó có thể hoán đổi cho nhau. ViewData["Foo"]ViewBag.Foo.

Và phạm vi. ViewBag và ViewData được đề cập để truyền dữ liệu giữa các Hành động của Bộ điều khiển và Xem nó hiển thị.


0

ViewBag là một loại động cho phép bạn đặt động hoặc nhận các giá trị và cho phép bạn thêm bất kỳ số lượng trường bổ sung nào mà không cần một lớp được đánh mạnh. Chúng cho phép bạn truyền dữ liệu từ bộ điều khiển sang xem. Trong bộ điều khiển ......

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

Trong quan điểm

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

Những gì tôi đã học được là cả hai đều phải có thuộc tính tên động lưu, tức là ViewBag.victor


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

        return _viewBag;
    }
}

3
Tôi yêu cầu bạn vui lòng thêm một số ngữ cảnh / bình luận xung quanh mã bạn đã chia sẻ. Nó sẽ giúp người hỏi và những người đọc khác trong tương lai hiểu bài đăng của bạn tốt hơn.
RBT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.