Asp.net-Mvc-3

在 F# 中設置 ViewBag 動態對象的屬性

  • December 7, 2020

我在 C# 中有這個動作方法:

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

這個視圖(Index.cshtml):

 <h2>@ViewBag.Message</h2>

這會在頁面上產生預期的“Hello”。

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

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

這會產生錯誤消息“找不到方法或對象建構子’op_DynamicAssignment’”。

我查看了一些用於動態運算符的 F# 程式碼範例,但我看不到任何短於幾頁描述和多行程式碼的內容。對於這個屬性“setter”來說,它們似乎太籠統了。

ViewBag屬性只是一個將ViewData集合公開為 type 屬性的包裝器dynamic,因此可以從 C# 動態訪問它(使用屬性集語法)。您可以使用?基於 DLR 的實現來做到這一點(請參閱SO 上的討論),但更容易定義?將數據直接添加到的運算符ViewDataDictionary(由ViewData屬性公開):

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

然後你應該可以寫

x.ViewData?Message <- "Hello"

引用自:https://stackoverflow.com/questions/8149127