【问题标题】:How can I call Html.Action from inside a @helper?如何从@helper 内部调用 Html.Action?
【发布时间】:2014-07-18 20:41:13
【问题描述】:

我需要显示一个对象的详细信息列表,以及父对象的所有子对象,所以我编写了这个递归助手。

当我尝试运行它时,我得到了这个错误:

编译器错误消息:CS1928:'System.Web.WebPages.Html.HtmlHelper' 不包含“操作”的定义和最佳扩展 方法重载 'System.Web.Mvc.Html.ChildActionExtensions.Action(System.Web.Mvc.HtmlHelper, string, string, object)' 有一些无效参数

来源错误:

@Html.Action("_PDFUserStories", "Screen", new { screenID = screen.ID})

在我使用局部视图之前,@Html.Action 工作正常,但是当我尝试在帮助程序中使用 @Html.Action 时它不起作用。我可以在助手中使用@Html.Action 吗?这是助手:

@helper ScreenDetails(UserStoriesApplication.Models.Screen screen)
{
<div style="page-break-after: always;">
    <div class="box col-12">
        <div class="box-header">
            <h2><i class="fa fa-desktop"></i>@screen.Name</h2>
            <div class="box-icon">

            </div>
        </div>
    </div>
    @if (screen.filename != null)
    {
        <img class="img-responsive screenImage" src="~/Content/ScreenImages/@screen.filename" alt="Screen" />
    }
    <div class="story-details" id="story-details">
        @Html.Action("_PDFUserStories", "Screen", new { screenID = screen.ID })
    </div>
</div>

    foreach(var childScreen in screen.Screen1)
    {
       @ScreenDetails(childScreen)

    }

}

【问题讨论】:

  • 我已经让它在助手中工作,但我看不出这里有什么问题。
  • 但是我的助手在视图中 - 我会尝试将它放在一个独立的文件中。

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

由于我不知道的原因,Helper 类附带的“Html”与视图附带的“Html”不同。 Helper 位于 System.Web.WebPages.Html 命名空间中,而 View 位于 System.Web.Mvc 命名空间中。这就是为什么它没有您期望的方法。然而,这可以通过将 Html 对象作为参数传递给您的助手来轻松解决。因此,您可以将 ScreenDetails 助手的签名更改为

@helper ScreenDetails(UserStoriesApplication.Models.Screen screen,
     System.Web.Mvc.HtmlHelper Html)

然后当你调用它时,只需传入视图的 Html 对象

@MyHelper.ScreenDetails(model, Html)

【讨论】:

  • 像魅力一样工作。我很惊讶这是必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多