2011-12-08 25 views
6

Nếu tôi có giá trị bên trong Dynamic ViewBag, tại sao tôi không thể chuyển nó vào phương thức? Vì vậy, vì mục đích đơn giản, giả sử tôi có ViewBag.SomeValue và tôi muốn chuyển số ViewBag.SomeValue cho Trình trợ giúp HTML. Nếu trình trợ giúp HTML chấp nhận động dưới dạng biến, tại sao nó không chấp nhận số ViewBag.SomeValue của tôi?Vượt qua ViewBag dưới dạng Paramerter

@Html.SimpleHelper(ViewBag.SomeValue) 

public static string SimpleHelper(this HtmlHelper html, dynamic dynamicString) 
{ 
    return string.Format("This is my dynamic string: {0}", dynamicString); 
} 
+0

Bạn có thể hiển thị một số mã không? Tôi đang sử dụng năng động trong mẫu aspx và giúp đỡ, có vẻ không có vấn đề cho điều đó. –

+0

Tôi vừa chỉnh sửa câu trả lời và thêm mã. – TYRONEMICHAEL

Trả lời

8

Như thông báo lỗi cho bạn biết, các phương thức mở rộng không thể được gửi động. Nó không được hỗ trợ trong .NET. Nó không có gì để làm với ASP.NET MVC hoặc Razor. Hãy thử viết một phương thức mở rộng cho một kiểu nào đó có một đối số động và sau đó thử gọi phương thức mở rộng này chuyển cho nó một biến động và bạn sẽ nhận được một lỗi thời gian biên dịch.

xem xét ví dụ giao diện điều khiển ứng dụng sau đây minh họa này:

public static class Extensions 
{ 
    public static void Foo(this object o, dynamic x) 
    { 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     dynamic x = "abc"; 
     new object().Foo(x); // Compile time error here 
    } 
} 

Vì vậy, bạn cần phải cast:

@Html.SimpleHelper((string)ViewBag.SomeValue) 

Trên thực tế, như Adam nói rằng bạn cần phải sử dụng mô hình quan điểm mạnh mẽ gõ và không bao giờ sử dụng ViewBag. Nó chỉ là một trong hàng triệu lý do tại sao ViewBag không nên được sử dụng.

+0

Cảm ơn bạn. Vẫn cần phải tìm hiểu thêm về năng động trong C#. – TYRONEMICHAEL

+0

Bạn vẫn có thể ref nó qua helper.ViewContext.Controller.ViewBag Mặc dù không? –

+0

Không, truy cập qua trả về (chuỗi) helper.ViewData ["Title"]; – Ted

3

Quan trọng hơn vì ViewBag là một thực tế không tốt để sử dụng vì chuỗi ma thuật như thuộc tính trên watchbag - bạn đang cố gắng gửi gì. Có lẽ có một cách tốt hơn? Bạn sẽ có thể sử dụng các ví dụ helper để tham khảo nó thông qua:

helper.ViewContext.Controller.ViewBag

nhưng tôi không phải là một sử dụng ViewBag trừ duy nhất cho Tiêu đề http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

+0

Tôi thích sử dụng các kiểu được nhập mạnh mẽ và chuyển mô hình vào trình trợ giúp. Nhưng cho phép nói ví dụ bạn muốn chuyển tiêu đề, trong trường hợp này là ViewBag.SomeValue, vào trình trợ giúp html. Bây giờ bạn có thể khai báo một chuỗi và làm cho nó bằng Viewbag và sau đó chuyển chuỗi vào helper. Nhưng điều đó chỉ làm cho sự đánh dấu rối rắm hơn nhiều. Tôi đã chỉnh sửa mã của mình ở trên để cho bạn biết thêm về những gì tôi đang cố gắng đạt được. – TYRONEMICHAEL

+0

Tôi đã khá chắc chắn câu trả lời của tôi ở trên để cung cấp một sửa chữa trong trường hợp cụ thể của bạn nếu bạn chọn để làm điều đó theo cách đó. –

+0

+1 - sau khi đọc điều này, tôi nhận ra rằng tôi sắp sửa làm điều gì đó ngu ngốc. Bạn đã cứu tôi :) – Matt

0

Tôi biết đây là câu hỏi cũ hơn nhưng đó là điều đã xảy ra đối với tôi khi tôi tìm kiếm sự cố này.

Thật dễ dàng để vượt qua ViewBag dưới dạng tham số bằng cách chỉ cần liệt kê nó dưới dạng động trong phương pháp. Ví dụ ở đây là cách tôi chuyển ViewBag vào một trong các lớp trợ giúp của tôi để sắp xếp cột.

public static IEnumerable<Models.MyViewModel> MyMethod(IEnumerable<Models.MyViewModel> model, string sortOrder, dynamic ViewBag) 
Các vấn đề liên quan