Playframework 将通用视图模板作为函数参数传递

Playframework 将通用视图模板作为函数参数传递,playframework,playframework-2.0,Playframework,Playframework 2.0,我有一些控制器函数,它们使用不同的视图模板进行渲染。但是,控制器函数中的代码非常相似,需要重构为一个公共函数。所以,我需要这样的东西: def controller1() = Action { // call some controller1-specific logic here refactoredFunc(views.html.view1) } def controller2() = Action { // call some controller2-specific log

我有一些控制器函数,它们使用不同的视图模板进行渲染。但是,控制器函数中的代码非常相似,需要重构为一个公共函数。所以,我需要这样的东西:

def controller1() = Action {
  // call some controller1-specific logic here
  refactoredFunc(views.html.view1)
}

def controller2() = Action {
  // call some controller2-specific logic here
  refactoredFunc(views.html.view2)
}

def refactoredFunc(view: play.api.templates.Html) = {
  // some common logic here
  Ok(view)
}
上面的方法很有效(至少可以编译),但我不高兴指定
refacturedfunc
只接受
Html
模板作为输入,因为这是一个不需要的人工约束

我尝试用
play.api.templates.BufferedContent[\u]
替换
play.api.templates.Html
,但编译器不喜欢这样


那么,有没有一种通用的方法可以在不强制要求视图为Html的情况下执行此操作?

您可能需要在RefacturedFunc中引入一个类型参数。由于Play使用mecanism发送响应,您还需要声明一个隐式的
可写的
参数

def refactoredFunc[C](view: C)(implicit writeable: Writeable[C]) = {
    Ok(view)
}

使用此代码,您可以使用任何类型的
C
调用
refacturedfunc
,该类型的
Writeable[C]
隐式可用。Play将自动为其常见用例定义这些隐式,如
Html
,…

谢谢!虽然这不是我需要的确切解决方案(我过度简化了我的问题描述-视图也包含参数),但它确实为我指明了正确的方向: