2011-11-16 8 views
6

mam tę metodę działania w C#:Ustaw obiekt na ViewBag dynamicznego obiektu w F #

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

i ten pogląd (Index.cshtml):

<h2>@ViewBag.Message</h2> 

I ta produkuje oczekiwane "Hello" na stronie.

Chcę wykonać kontroler w F #. Próbowałem już próbować:

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

I to generuje komunikat o błędzie "Nie znaleziono konstruktora obiektu lub obiektu" op_DynamicAssignment ".

Przyjrzałem się niektórym próbkom kodu F # dla operatora dynamicznego i nie widzę niczego, co jest krótsze niż kilka stron opisu i wiele linii kodu. Wydaje się, że są zbyt ogólni dla tego "setera" nieruchomości.

Odpowiedz

10

Obiekt ViewBag tylko wrapper który eksponuje kolekcję ViewData jako właściwość typu dynamic, tak aby mogła ona być dostępne dynamicznie z C# (używając składni zestawu właściwości). Można użyć realizację ? podstawie DLR to zrobić (patrz this discussion at SO), ale łatwiej jest określić ? operatora, który dodaje dane bezpośrednio do ViewDataDictionary (który jest wystawiony przez właściwość ViewData):

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

wtedy powinien być w stanie napisać:

+0

Yay! Zadziałało! :) –

+0

# Tomas Dając kredyt tam, gdzie jest należny, użyłem twojego pustego szablonu WWW F #, opisanego w http://msdn.microsoft.com/en-us/library/hh304375.aspx, aby wygenerować ten kod w ciągu zaledwie minuty (ale problem pojawił się w prawdziwym projekcie). –

+0

Potrzebowałem go również dla TempData, więc zmieniono pierwszy parametr na '(słownik: IDictionary )' –

1

Zamiast

x?ViewBag <- "Hello" 

Spróbuj:

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

Dziękuję. Zrobiłem to, ale nadal produkuje "Konstruktor obiektu lub obiektu" nie znaleziono "op_DynamicAssignment". Zmieniłem to pytanie, by uwzględnić tę sugestię. –

Powiązane problemy