我试图在我的App_Code文件夹中为一个MVC3RTM项目创建一个Razor声明性助手。
我遇到的问题是,像ActionLink这样的HtmlHelper扩展是不可用的。这是因为编译的帮助器派生自System.Web.WebPages.HelperPage
,尽管它公开了一个Html
属性,但它的类型是System.Web.WebPages.HtmlHelper
而不是System.Web.Mvc.HtmlHelper
。
我遇到的这种错误的一个例子是:
'System.Web.Mvc.HtmlHelper‘不包含'ActionLink’的定义,并且找不到接受类型为'System.Web.Mvc.HtmlHelper‘的第一个参数的扩展方法'ActionLink’(是否缺少using指令或程序集引用?)
我唯一的解决方案是创建我自己的HelperPage并覆盖Html属性:
using System.Web.WebPages;
public class HelperPage : System.Web.WebPages.HelperPage
{
// Workaround - exposes the MVC HtmlHelper instead of the normal helper
public static new HtmlHelper Html
{
get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
}
}
然后,我必须在每个helper的顶部编写以下代码:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
这在MVC3中是很难的吗,还是我做错了什么?
发布于 2011-01-17 17:38:16
看看Marcind
's answer对这个问题的回答。您正在经历的是将声明性视图放在App_Code
文件夹中的限制。
将你的助手放在App_Code中是可行的,但是有一些限制会影响到某些MVC场景(例如:不能访问标准的MVC Html。帮助器)
发布于 2011-04-06 03:38:52
我为WebPages帮助器创建了一个扩展方法,以便可以访问页面帮助器。
public static HtmlHelper GetPageHelper(this System.Web.WebPages.Html.HtmlHelper html)
{
return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html;
}
发布于 2011-01-18 03:19:47
奥马尔在这里得到了正确的答案,但我想添加一些东西(请随意将奥马尔的回答标记为答案)。
我们在v1中就意识到了这一点,并且无法在产品中获得很好的修复,但是David Ebbo ( ASP.Net团队的一名架构师)发布了一个Visual Studio代码生成器的示例,这基本上是对我们正在寻找的使其正常工作的想法的第一次探索:http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries.aspx
试一试,看看你的想法!如果你有什么意见,可以在David的博客上发表。
https://stackoverflow.com/questions/4710853
复制相似问题