2011-11-16 25 views
6

tôi có phương pháp này hành động trong C#:Thiết lập một tài sản trên đối tượng động ViewBag trong F #

public ActionResult Index() { 
     ViewBag.Message = "Hello"; 
     return View(); 
    } 

Và quan điểm này (Index.cshtml):

<h2>@ViewBag.Message</h2> 

Và điều này tạo ra "Hello" được mong đợi trên trang.

Tôi muốn làm bộ điều khiển trong F #. Tôi đã thử

type MainController() = 
    inherit Controller() 
    member x.Index() = 
    x.ViewBag?Message <- "Hello" 
    x.View() 

Và điều này tạo ra thông báo lỗi "Phương thức hoặc hàm tạo đối tượng 'không tìm thấy".

Tôi đã xem xét một số mẫu mã F # cho toán tử động và tôi không thể thấy bất kỳ điều gì ngắn hơn một vài trang mô tả và nhiều dòng mã. Họ dường như quá chung chung đối với tài sản "setter" này.

Trả lời

10

Thuộc tính ViewBag chỉ là một wrapper đó cho thấy nhiều bộ sưu tập ViewData như một loại tài sản của dynamic, để nó có thể được truy cập tự động từ C# (sử dụng cú pháp thiết lập thuộc tính). Bạn có thể sử dụng thực hiện ? dựa trên DLR để làm điều đó (xem this discussion at SO), nhưng nó là dễ dàng hơn để xác định ? điều hành có thêm dữ liệu trực tiếp đến ViewDataDictionary (được tiếp xúc bởi ViewData tài sản):

let (?<-) (viewData:ViewDataDictionary) (name:string) (value:'T) = 
    viewData.Add(name, box value) 

Sau đó, bạn sẽ có thể viết

x.ViewData?Message <- "Hello" 
+0

Yay! Nó đã làm việc! :) –

+0

#Tomas Cho tín dụng khi đến hạn, tôi đã sử dụng Mẫu Web Rỗng F # của bạn, được mô tả trong http://msdn.microsoft.com/en-us/library/hh304375.aspx, để tạo mã này chỉ trong một phút (nhưng vấn đề đã nảy sinh trong một dự án thực sự). –

+0

Tôi cũng cần cung cấp cho TempData, vì vậy thay đổi paramater đầu tiên thành '(dictionary: IDictionary )' –

1

Thay vì

x?ViewBag <- "Hello" 

Hãy thử:

x.ViewBag?Message <- "Hello" 
+0

Thankyou. Tôi đã làm điều đó nhưng nó vẫn tạo ra "Phương thức hoặc đối tượng constructor" op_DynamicAssignment 'không tìm thấy ". Tôi đã chỉnh sửa câu hỏi đó để bao gồm đề xuất này. –

Các vấn đề liên quan