相关疑难解决方法(0)

使用Razor声明性视图中的MVC HtmlHelper扩展

我试图在我的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中这么难,或者我做错了什么?

asp.net-mvc razor asp.net-mvc-3

121
推荐指数
5
解决办法
7万
查看次数

为什么在Razor声明式@helper方法中HtmlHelper实例为null?

使用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中尝试声明性辅助方法(到目前为止它们似乎有点受限)并且我对我在这里看到的东西感到非常难过.

.net razor razor-declarative-helpers asp.net-mvc-3

36
推荐指数
5
解决办法
1万
查看次数

使用ASP.NET MVC 3在App_code文件夹中使用剃刀@helper

我在哪里可以找到有关如何使其正常工作的教程?

我试图在我的MVC3应用程序的App_code目录中使用@helper,到目前为止,当我尝试在其他剃刀页面中使用它们时,它们无法找到.

razor asp.net-mvc-3

31
推荐指数
2
解决办法
2万
查看次数

在App_Code中共享@helper中使用@Html

我正在构建一个非常基本的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)

asp.net-mvc razor razor-declarative-helpers asp.net-mvc-3

29
推荐指数
4
解决办法
2万
查看次数

如何将lambda传递给Razor辅助方法?

我有一个剃须刀助手方法需要接受一个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的内联助手不能捕获外部变量吗?

c# asp.net-mvc lambda html-helper razor

13
推荐指数
1
解决办法
7173
查看次数

Razor RTM中的声明性助手方法

我通过他的博客看到了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没有被定义....所以我把它搞砸了?我有什么需要做的事情来将这些视图注册为帮助者吗?

谢谢.

.net asp.net razor asp.net-mvc-3

8
推荐指数
1
解决办法
1996
查看次数

如何在App_Code文件夹中的Razor视图中使用Url.Action

如何在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.

asp.net-mvc html-helper razor asp.net-mvc-4 razor-2

3
推荐指数
1
解决办法
2240
查看次数