Установить свойство динамического объекта ViewBag в F # - PullRequest
7 голосов
/ 16 ноября 2011

У меня есть этот метод действия в C #:

  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 »not found».

Я рассмотрел некоторые примеры кода F # для динамического оператора и не вижу ничего, что короче, чем несколько страниц описания и много строк кода. Они кажутся слишком общими только для этого свойства "setter".

Ответы [ 2 ]

11 голосов
/ 16 ноября 2011

Свойство ViewBag - это просто оболочка, которая представляет коллекцию ViewData как свойство типа dynamic, так что к ней можно динамически обращаться из C # (используя синтаксис набора свойств). Для этого можно использовать реализацию ? на основе DLR (см. в этом обсуждении на SO ), но проще определить оператор ?, который добавляет данные непосредственно в ViewDataDictionary (который доступен по свойству ViewData):

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

Тогда вы сможете написать

x.ViewData?Message <- "Hello"
1 голос
/ 16 ноября 2011

вместо

x?ViewBag <- "Hello"

Попробуйте:

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