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
这将被称为
@Html.jQueryTmpl("templateId", @any type of valid razor syntax here )
基本上只需使用Func
作为参数和template.Invoke(null)
(如有必要,带参数)来渲染它。 显然,您可以跳过对.Invoke()
的调用,以避免呈现“默认”标记。
只是为了扩展已接受的答案,因为我花了很长时间来解决类似的问题,这就是出现的问题。 我真正需要的是@helper
,它会接受剃刀文本,因为模板应该包含相当多的代码。 我玩了很长时间试图使用几个版本的@helper item(Func
,这是我在网上找到的,没有成功。 因此,我采取了以下方法:
namespace project.MvcHtmlHelpers { public static class HelperExtensions { public static MvcHtmlString RazorToMvcString(this HtmlHelper htmlHelper, Func
和
@project.MvcHtmlHelpers @helper item(other input, MvcHtmlString content) { ...other stuff... @content }
并使用此通过
@item(other input, @Html.RazorToMvcString(@this is a test ))
现在我可以使用辅助模板进行Razor输入,但我也可以放入部分视图,这在某些方面很方便。 由于我不是专家,可能有更好的选择,但对我来说这似乎是一种灵活的方法。
更进一步,可以将标记直接传递给帮助程序,而无需扩展方法。
@helper HelperWithChild(Func
对于多行标记,还需要
:
@HelperWithChild(@ @AnotherHelper() With more markup
) @helper AnotherHelper() { Another helper
}
虽然我不确定this
将如何与Model
一起发挥 – 我的助手只使用他们的参数。