创建类似于 BeginForm 的 html 帮助程序,您可以在其中访问块服务器端的内容

Posted

技术标签:

【中文标题】创建类似于 BeginForm 的 html 帮助程序,您可以在其中访问块服务器端的内容【英文标题】:Create html helper similar to BeginForm where you can gain access to the content of the block server-side 【发布时间】:2011-09-25 16:14:05 【问题描述】:

我正致力于在 ASP.NET MVC 项目中集成自动 CoffeeScript 编译。如果您在脚本标签中指定一个 .coffee 文件,我已经有这部分工作,它会将其编译为服务器上的 javascript

我希望能够对嵌入在视图中的 CoffeeScript 执行相同的操作。是否可以编写各种 htmlHelper,让我可以在 using 块中捕获用户提供的内容,类似于 Html.BeginForm 使用 IDispose 的工作方式?

【问题讨论】:

【参考方案1】:

Html.BeginForm() 实际上并不捕获using 块的内容。它只是用表单标签包围它,通过将开始标签和结束标签写入Dispose方法上的响应,来自IDisposable

请参阅Html.BeginForm() 的实现here,以及Dispose 方法here。

如果您真的想捕获块的内容,您可能需要编写一个以Razor Template 作为参数的辅助方法。

通过实现以下方法:

public static class HtmlHelperExtensions

    public static string CoffeeScript(this HtmlHelper htmlHelper, Func<HelperResult> template)
    
        // Then you can access the contents of the block here
        string contents = template().ToHtmlString();

        return DoSomething(string);
    

您可以像这样在 Razor 视图中使用它:

@Html.CoffeeScript(@<text>
    Anything can go here
</text>;);

更新: 澄清一下,鉴于您的扩展方法属于 MyApplication.Extensions 命名空间,您应该在视图顶部添加以下内容:

@using MyApplication.Extensions;

【讨论】:

以上是关于创建类似于 BeginForm 的 html 帮助程序,您可以在其中访问块服务器端的内容的主要内容,如果未能解决你的问题,请参考以下文章

Html.BeginForm 使用 FormMethod.GET 丢失 routeValues

Html.BeginForm 在区域后自动添加子文件夹

MVC小系列Html.BeginForm与Ajax.BeginForm

创建一个类似于Windows资源管理器的下拉树菜单

如何使用 Html.Listboxfor 和 Html.Beginform

Html.BeginForm (ASP.NET MVC) 的问题