ASP.Net MVC3 – 将剃刀标记作为参数传递

我有一个名为EditableArea的帮助器,它为用户提供了一个运行时可编辑的div (通过JS)。 EditableArea帮助程序检查数据库中是否存在具有指定ID的可编辑区域(与MVC的Area无关),如果是,则呈现该区域的HTML,否则它将显示指定为辅助程序的参数的默认标记:

 @Html.EditableArea(someId, "

Click to edit contents

")

一切正常,但我想更改它,以便默认标记不是作为字符串指定,而是在剃刀语法中,如下所示:

 @using (Html.EditableArea(someId)) { 

Click to edit contents

}

或类似的东西,比如@section在MVC3中的工作方式。

我怎样才能做到这一点?

我可以创建一个IDisposable ,它的Dispose关闭了TagBuilder等,但即使帮助器找到一个带ID的区域,我也无法避免渲染内部Razor标记(我可以清除Dispose()中的渲染内容但是里面的代码{}仍会运行,我想跳过)。

如果我不使用using是否有其他方法将剃刀块传递给帮助器,帮助器实际可能会或可能不会实现?

这是我用来通过传递模板Id和模板本身的razor样式语法来呈现jQuery模板标记的示例:

 public static MvcHtmlString jQueryTmpl(this HtmlHelper htmlHelper, string templateId, Func template) { return MvcHtmlString.Create(""); } 

这将被称为

 @Html.jQueryTmpl("templateId", @any type of valid razor syntax here) 

基本上只需使用Func作为参数和template.Invoke(null) (如有必要,带参数)来渲染它。 显然,您可以跳过对.Invoke()的调用,以避免呈现“默认”标记。

只是为了扩展已接受的答案,因为我花了很长时间来解决类似的问题,这就是出现的问题。 我真正需要的是@helper ,它会接受剃刀文本,因为模板应该包含相当多的代码。 我玩了很长时间试图使用几个版本的@helper item(Func input) ,这是我在网上找到的,没有成功。 因此,我采取了以下方法:

 namespace project.MvcHtmlHelpers { public static class HelperExtensions { public static MvcHtmlString RazorToMvcString(this HtmlHelper htmlHelper, Func template) { return MvcHtmlString.Create(template.Invoke(null).ToString()); } } } 

 @project.MvcHtmlHelpers @helper item(other input, MvcHtmlString content) { 
...other stuff...
@content
}

并使用此通过

 @item(other input, @Html.RazorToMvcString(@this is a test)) 

现在我可以使用辅助模板进行Razor输入,但我也可以放入部分视图,这在某些方面很方便。 由于我不是专家,可能有更好的选择,但对我来说这似乎是一种灵活的方法。

更进一步,可以将标记直接传递给帮助程序,而无需扩展方法。

 @helper HelperWithChild(Func renderChild) { 
@renderChild(this)
} @HelperWithChild(@

Hello

)

对于多行标记,还需要

 @HelperWithChild(@ @AnotherHelper() 

With more markup

) @helper AnotherHelper() {

Another helper

}

虽然我不确定this将如何与Model一起发挥 – 我的助手只使用他们的参数。