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

Tre*_*bob 29 asp.net-mvc razor razor-declarative-helpers asp.net-mvc-3

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

Rya*_*com 35

我现在将它添加到App_Code中的任何.cshtml文件中.

// Using's are needed to ensure helpers function correctly.
@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Web.Mvc.Routing;
@using System.Web.Mvc.Razor;
@functions {
    private static WebViewPage page { get { return PageContext.Page as WebViewPage; } } 
    private static System.Web.Mvc.HtmlHelper<dynamic> html { get { return page.Html; } }
    private static UrlHelper url { get { return page.Url; } }
    private static dynamic viewBag { get { return page.ViewBag; } }
}
Run Code Online (Sandbox Code Playgroud)

编辑:已将辅助变量名称修改为小写,因为我与内置帮助程序名称有一些冲突.我修改了html帮助器是通用的,它允许使用TextBoxFor等帮助器

这使得这些精彩的帮助程序可用于文件中的所有@helper方法和函数.

非常感谢Neshta的原创理念!


回答问题的完整示例:

在App_Code文件夹中的RMB.cshtml中

@functions {
    public static WebViewPage page = (PageContext.Page as WebViewPage);
    public static HtmlHelper<object> html = page.Html;
}

@helper ReplaceCrLf(string strText)
{
    @html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}
Run Code Online (Sandbox Code Playgroud)

在视图中:

@RMB.ReplaceCrLf("line1\nline2") // No passing HtmlHelper
Run Code Online (Sandbox Code Playgroud)


Erd*_*tur 21

我使用了像下面这样的解决方法

@helper HtmlRaw(string s)
{
    @(new HtmlString(s))
}

@helper ReplaceCrLf(string strText)
{
    @HtmlRaw(HttpUtility
                        .HtmlEncode(strText)
                        .Replace(Environment.NewLine, "<br />"));
}
Run Code Online (Sandbox Code Playgroud)


Nes*_*hta 15

可以从PageContext获取帮助程序:

var page = (WebViewPage) PageContext.Page;
var Url = page.Url;
var Html = page.Html;
var ViewBag = page.ViewBag;
// and so on
Run Code Online (Sandbox Code Playgroud)

用法(如标准助手):

@Url.Action("Index", "Home")
@Html.Raw("some encoded string")
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 7

看起来像App_Code中的帮助程序,但您无法访问标准的MVC Html.助手

请参阅Razor:声明性HTML帮助程序

  • 嗨!我在ASP.NET用户语音中创建了一个与此相关的想法:[支持@helper ExtensionMethod(此HtmlHelper html)用于APP_CODE中的视图](http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this-htmlhelper-ht)...帮助我们对它的前线感谢...谢谢! (2认同)