我试图在我的App_Code文件夹中为MVC 3 RTM项目创建一个Razor声明性帮助器.
我遇到的问题是MVC HtmlHelper扩展(如ActionLink)不可用.这是因为编译的帮助程序派生自System.Web.WebPages.HelperPage,虽然它公开了一个Html属性,但它的类型System.Web.WebPages.HtmlHelper而不是System.Web.Mvc.HtmlHelper.
我得到的一种错误的例子是:
'System.Web.Mvc.HtmlHelper'不包含'ActionLink'的定义,也没有扩展方法'ActionLink'接受类型为'System.Web.Mvc.HtmlHelper'的第一个参数'(你是否缺少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; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后我必须在每个助手的顶部写下面的内容:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
Run Code Online (Sandbox Code Playgroud)
它是否意味着在MVC 3中这么难,或者我做错了什么?
使用MVC 3 RTM我变得很奇怪NullReferenceException:
@helper TestHelperMethod() {
var extra = "class=\"foo\"";
<div @Html.Raw(extra)></div>
}
Run Code Online (Sandbox Code Playgroud)
事实证明Html(类型HtmlHelper)是null.
我以前从未在常规视图中看过这个.我开始在Razor中尝试声明性辅助方法(到目前为止它们似乎有点受限)并且我对我在这里看到的东西感到非常难过.
我在哪里可以找到有关如何使其正常工作的教程?
我试图在我的MVC3应用程序的App_code目录中使用@helper,到目前为止,当我尝试在其他剃刀页面中使用它们时,它们无法找到.
我正在构建一个非常基本的MVC3站点,而我学习并且我在使用以下声明性Razor html帮助器时遇到困难.
在App_Code文件夹里面的RMB.cshtml里面:
@helper ReplaceCrLf(string strText)
{
@Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
Run Code Online (Sandbox Code Playgroud)
在我的index.cshtml视图中:
@RMB.ReplaceCrLf(Model.Post)
Run Code Online (Sandbox Code Playgroud)
这给了我帮助器中Html的空引用异常,因为它似乎不知道它是什么.我可以通过将Html从视图传递给帮助器来解决这个问题,但我想知道是否有另一种方式让我的共享html助手能够引用Html而不必将其传递给我写的助手?
为了完整起见,这是工作方法:
在App_Code中的RMB.cshtml中
@helper ReplaceCrLf(string strText, System.Web.Mvc.HtmlHelper Html)
{
@Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
Run Code Online (Sandbox Code Playgroud)
在index.cshtml视图中
@RMB.ReplaceCrLf(Model.Post, Html)
Run Code Online (Sandbox Code Playgroud) 我有一个剃须刀助手方法需要接受一个Func<>将返回一些HTML内容打印输出.这是我原来的:
@helper node(string title, Func<HelperResult> descriptions)
{
....
<div>@descriptions()</div>
....
}
@node("title",
new Func<HelperResult>(() =>
{
return new HelperResult(
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>);
}))
Run Code Online (Sandbox Code Playgroud)
不幸的是,我的文字永远不会打印出来.也没有错误.
所以我学习了内联帮助器,并将调用方法更改为:
@node("title",
@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>)
Run Code Online (Sandbox Code Playgroud)
但是现在我收到编译错误说
"委托'System.Func'不接受1个参数".
但我并没有传递任何论点.
因此,如果我将其更改为Func<object,HelperResult>然后使用它调用它@descriptions(null)我得到以下错误:
"如果没有先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态调度操作的参数"
我确定我在某处出了点问题,但我不确定它到底是什么.
编辑:我想我可能已经解决了这个问题,但它引入了一些其他问题.
我做的是在传递动态方法之前施放lambda.我猜这就是错误试图说的:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>"desc1"</span>
<span>"desc2"</span>
</text>))
Run Code Online (Sandbox Code Playgroud)
这有效,它可以span正确地打印出标签.不幸的是,在调用它时我必须传入一个无用的参数Func.
现在我的问题是我的真正功能不仅仅是写一些跨度.它更像是这样的:
@node("title",
((Func<dynamic, HelperResult>)(@<text>
<span>@Helpers.Format(resource.Description,"item")</span>
</text>))
Run Code Online (Sandbox Code Playgroud)
哪里@Helpers.Format是另一个助手和资源是从页面模型(动态)变量.
当然现在代码运行但没有打印出来(在<span>标签内).我在我的Format辅助函数中放了一个断点,它命中它并且所有参数都被正确设置,所以我不确定它为什么输出不正确.同样,如果我只是将其更改为resource.Description,那么仍然没有输出.
由于它在这个上下文之外运行良好,我想知道Razor的内联助手不能捕获外部变量吗?
我通过他的博客看到了Scott Guthrie关于辅助方法的帖子.
特别是这个:

我看到一堆RC版本的MVC 3帖子关于缺少辅助方法...我看到它的语法支持(@helper)得到突出显示,但我有这个/Views/Helpers/SomeHelper.cshtml(定义为局部视图):
@helper SomeHelper(string text)
{
if (text != null)
{
<text>
@text
</text>
}
else
{
<text>
Unknown
</text>
}
}
Run Code Online (Sandbox Code Playgroud)
我用这种方式:
<div>
Helper with Text:
@SomeHelper("This is not null text.")
</div>
Run Code Online (Sandbox Code Playgroud)
但我得到的SomeHelper没有被定义....所以我把它搞砸了?我有什么需要做的事情来将这些视图注册为帮助者吗?
谢谢.
如何在App_Code文件夹的Razor助手中使用Url.Action()?
我试过根据为什么我不能在App_Code文件夹中的剃刀助手视图文件中使用Html.RenderPartial?
@using System.Web.Mvc.Html
@helper Tabel(System.Web.Mvc.HtmlHelper html)
{
@Html.Raw(Url.Action("Index", "Home"))
}
Run Code Online (Sandbox Code Playgroud)
但得到了编译错误
CS0103:当前上下文中不存在名称"Url"
使用ASP.NET MVC4和jquery.