2011-11-16 21 views
6

que tienen este método de acción en C#:establecer una propiedad de objeto dinámico ViewBag en Fa #

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

Y este punto de vista (Index.cshtml):

<h2>@ViewBag.Message</h2> 

y esto produce el esperado "Hola" en la página.

Quiero hacer el controlador en F #. He intentado

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

y esto produce el mensaje de error "Método o constructor de objeto 'op_DynamicAssignment' no encontrado".

He examinado algunas de las muestras del código F # para el operador dinámico, y no puedo ver nada que sea más corto que varias páginas de descripción y muchas líneas de código. Parecen ser demasiado generales para solo esta propiedad "setter".

Respuesta

10

La propiedad ViewBag es sólo un envoltorio que expone la colección ViewData como una propiedad de tipo dynamic, de modo que se puede acceder de forma dinámica desde C# (usando la sintaxis del conjunto de propiedades). Usted podría utilizar la aplicación de ? basado en DLR de hacerlo (ver this discussion at SO), pero es más fácil de definir ? operador que añade datos directamente a ViewDataDictionary (que se muestra en la propiedad ViewData):

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

A continuación, debería poder escribir

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

¡Yay! ¡Funcionó! :) –

+0

#Tomas Dando crédito donde es debido, utilicé tu Plantilla F # Web vacía, descrita en http://msdn.microsoft.com/en-us/library/hh304375.aspx, para generar este código en solo un minuto (pero el problema surgió en un proyecto real). –

+0

Necesitaba también proporcionarlo para TempData, así que cambié el primer parámetro a '(diccionario: IDictionary )' –

1

En lugar de

x?ViewBag <- "Hello" 

Probar:

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

Gracias. Lo he hecho pero todavía produce "Método u objeto constructor 'op_DynamicAssignment' no encontrado". He editado esa pregunta para incluir esta sugerencia. –

Cuestiones relacionadas