2011-11-16 77 views
6

我在C#這個動作方法:上設置ViewBag動態對象中的屬性在F#

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

而這個視圖(Index.cshtml):

<h2>@ViewBag.Message</h2> 

並且這產生頁面上預期的「你好」。

我想在F#中做控制器。我試過

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

這產生錯誤信息「方法或對象的構造‘op_DynamicAssignment’未找到」。

我已經看過一些動態運算符的F#代碼示例,我看不到任何比幾頁描述和許多代碼行更短的東西。他們似乎太籠統了,不過這個屬性「二傳手」。

回答

10

ViewBag酒店就暴露出ViewData集合作爲dynamic類型的屬性,以便它可以動態地從C#訪問的包裝(使用屬性集語法)。你可以基於DLR做到這一點(見this discussion at SO)使用實施?,但它更容易定義?運營商直接將數據添加到ViewDataDictionary(這是由ViewData屬性暴露):

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

然後你應該可以寫

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

耶!有效! :) –

+0

#Tomas在應有的位置給予獎勵,我使用了http://msdn.microsoft.com/en-us/library/hh304375.aspx中描述的F#空Web模板,在短短一分鐘內生成此代碼(但問題確實出現在一個真實的項目中)。 –

+0

我還需要爲TempData提供它,所以將第一個參數更改爲'(字典:IDictionary )' –

1

而不是

x?ViewBag <- "Hello" 

嘗試:

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

謝謝。我已經這樣做了,但它仍然產生「方法或對象構造函數'op_DynamicAssignment'未找到」。我已經編輯了這個問題來包含這個建議。 –