从内联助手调用扩展助手 - 如何?

Posted

技术标签:

【中文标题】从内联助手调用扩展助手 - 如何?【英文标题】:Calling extension helpers from inline helpers - how? 【发布时间】:2011-06-08 08:27:33 【问题描述】:

我读到了这个[useful article],它说我可以通过将它们放在特殊文件夹 App_Code 的视图中来创建一个内联助手库。当我将我的 @helper 函数移到那里时,我停止了对扩展助手的调用。我读到[in this SO article] 有一个问题,因为@helpers 是静态的,但我的扩展不是...我尝试了两种不同的方法,但无法使其工作。它无法识别我的扩展助手的存在。

'System.Web.WebPages.html.HtmlHelper' does not contain a definition for 'Image'

我的扩展助手名为“Image”。我应该寻找什么?

【问题讨论】:

看看您尝试了哪两种方法会很有帮助。您是否像这样使用了帮助程序的完整路径:@CustomHelpers.Truncate(ViewBag.Message, 8) 在这种情况下,您不需要 CustomHelpers.cshtml 文件的“使用”? 【参考方案1】:

当您在 razor 视图中编写 Helperextension 时。 您需要像 FileName.Method 一样调用它。

例如,您在 app_code 中有 CustomHelpers.cshtml 文件,并且您有一个方法

     @helper TruncateString(string input, int length)
             
        if (input.Length <= length)
              
            @input        
        
        else
         
          @input.Substring(0, length)<text>...</text>        
        
    

你可以从 index.cshtml 中调用它

    @CustomHelpers.TruncateString("Example", 8); 

【讨论】:

【参考方案2】:

例如,以下代码使用帮助程序库中的“RenderPage”函数:

@helper GetSection(string sectionName, string sectionTitle, string sectionFileName)
    <div id="@sectionName">
        <h1>@sectionTitle</h1>
        @System.Web.WebPages.WebPageContext.Current.Page.RenderPage("~/Views/Shared/MySections/" + @sectionFileName)
    </div>

它演示了如何检索“当前页面”(上下文相关)实例。

此代码在您自己的“公共库”Razor 帮助文件 (“.cshtml”) 中运行良好,该文件位于项目的“*app_code*”子文件夹中。

【讨论】:

【参考方案3】:

好的,我的问题与命名空间有关...所以我在 \Views\Shared\HtmlHelpers.cs 中:

public static class Html

    public static MvcHtmlString Image(this HtmlHelper helper, string src, object htmlAttrs = null)
    

我通常像这样从我的页面访问:

@Html.Image("/path/to/image")

在 App_Code\Helpers.cshtml 中:

@helper AddButton(string path)

    var Html = ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html;
    @Html.Image(path);

但 Intellisense 会在“图像”下划线并抱怨:

'System.Web.Mvc.HtmlHelper<object>' does not contain a definition for 'Image'
and no extension method 'Image' accepting a first argument of type 
'System.Web.Mvc.HtmlHelper<object>' could be found (are
you missing a directive or an assembly reference?)

原因似乎是 Helpers.cshtml 需要有 @using 作为命名空间...在我的常规页面上,命名空间包含在我的 web.config 中,但此页面似乎不受该机制的约束

【讨论】:

以上是关于从内联助手调用扩展助手 - 如何?的主要内容,如果未能解决你的问题,请参考以下文章

jquery ui 可拖动 + 可排序助手样式

如何为动态生成的内容编写自定义表单助手模板?

什么是内联函数

thymeleaf CSS内联表达式前端css里面怎么获取后台模板值

ASP.NET Core MVC 标签助手参数中的字符串文字

如何添加谷歌访问助手