2011-11-16 76 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'未找到”。我已经编辑了这个问题来包含这个建议。 –