【问题标题】:Html helpers are running AFTER view engineHtml 助手在视图引擎之后运行
【发布时间】:2011-06-22 12:00:05
【问题描述】:

我正在使用带有 Razor 引擎的 ASP.Net MVC 3。

我有一个将返回@Url.Action 的html 助手。我遇到的问题是 @Url.Action 没有转换为正确的 url。相反,@Url.Action 作为 html 的一部分返回。

看起来剃须刀引擎在运行,然后 html 助手在事后运行?这对我来说似乎有点倒退。有什么我可以改变的,以便我的助手首先运行吗?

这是一个例子:

public static HtmlString Test(this HtmlHelper helper)
{ 
    return new HtmlString("@Url.Action('Logoff', 'Login'");
}

在我的 _Layout.cshtml 我有这个..

@Html.Test()

并且 html 将显示为 @Url.Action('Logoff', 'Login')

【问题讨论】:

  • 未转换为正确的网址。它究竟转换成什么?编码字符串?
  • @Url.Action 作为 html 的一部分返回。
  • 你能从你的助手发布一些代码,以及你如何从视图中调用它吗?
  • 显然我的示例太简单了。我实际上是在尝试返回 URL 列表。不只是一个。一天结束时我真正想要的是基于站点地图文件的动态菜单,我已经在其中进行了一些角色检查。
  • 所以等等——回到我原来的观点。 HtmlHelpers 似乎无法返回 Razor 代码。相反,他们必须自己完成工作才能获得真正的 html。是这样吗?

标签: asp.net-mvc-3 razor html-helper


【解决方案1】:

它返回一个字符串,因为您在 Url.Action 周围有引号 - 删除引号和 @ 并且它应该被评估。

【讨论】:

    【解决方案2】:

    在处理 url 时,扩展 UrlHelper 似乎更合适和自然:

    public static string Test(this UrlHelper helper)
    {
        return helper.Action("Logoff", "Login");
    }
    

    在你看来:

    @Url.Test()
    

    【讨论】:

    • 我们实际上是在构建一个菜单。我只是举了一个简短的例子。
    • @ShaneC,其实我不太明白你想要什么。您希望在发送到浏览器的最终生成的 HTML 中以 /Login/Logoff 或 @Url.Action('Logoff', 'Login') 结尾?
    • 我想看 /Login/Logoff 但它更像是
    • 注销
    • 因为我不是只是试图返回一个 URL。我正在尝试创建一个菜单,其中将嵌入一堆网址。
  • @ShaneC,太好了,那么我的回答应该为您指明正确的方向。如果您想要锚点,请扩展 HtmlHelper 并返回 helper.ActionLink。
  • 查看我对我的评论的更新。我想要一个大字符串。不仅仅是一个 URL。
  • 【解决方案3】:

    您已经引用了您的 url.action 命令,这已将其转换为文字字符串。

    @ 的使用也是剃刀语法,在模型/控制器文件中不起作用

    使用

    public static HtmlString Test(this HtmlHelper helper)
    { 
        return new HtmlString( helper.Action('Logoff', 'Login') );
    }
    

    【讨论】:

    • 但是我们返回的代码将被注入到 Razor 视图中。所以即使那样我们也不需要 Razor 的 @?
    • @Shane,您将需要@html.Test() 的view 代码中的@ 语法。看看weblogs.asp.net/scottgu/archive/2010/07/02/… 看看@ 替换了什么。它只是一个符号,表示后面有代码。在您的控制器和模型中,您始终处于代码模式..
    • 对不起,我没有注意到您正在使用实际的助手进行生成。这似乎是正确的方向。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签