Using @Html inside shared @helper in App_Code

南楼画角 提交于 2019-11-30 11:22:32

问题


I am building a very basic MVC3 site while I learn and I am having difficulty with the following declarative Razor html helper.

Inside RMB.cshtml inside App_Code folder:

@helper ReplaceCrLf(string strText)
{
    @Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}

Inside my index.cshtml view:

@RMB.ReplaceCrLf(Model.Post)

This gives me a null reference exception on Html in the helper, because it doesn't seem to know what it is. I can work around this by passing Html from the view to the helper, but I was wondering if there is another way for my shared html helpers to be able to reference Html without me having to pass it in to ever helper I write?

For completeness, here is the working workaround:

In RMB.cshtml in App_Code

@helper ReplaceCrLf(string strText, System.Web.Mvc.HtmlHelper Html)
{
    @Html.Raw(Html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}

In index.cshtml view

@RMB.ReplaceCrLf(Model.Post, Html)

回答1:


I add this to any .cshtml files in App_Code now.

// 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; } }
}

EDIT: Have modified the helper variable names to lowercase as I have had some conflicts with the built in helpers names. I have modified the html helper to be generic which allows use of TextBoxFor etc helpers

This makes those wonderful helpers available to all @helper methods and functions in the file.

Many thanks to Neshta for the original concept!


Complete Example to answer question:

In RMB.cshtml in the App_Code folder

@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 />"));
}

In View:

@RMB.ReplaceCrLf("line1\nline2") // No passing HtmlHelper



回答2:


I used a workaround like following

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

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



回答3:


It is possible to get helpers from the PageContext:

var page = (WebViewPage) PageContext.Page;
var Url = page.Url;
var Html = page.Html;
var ViewBag = page.ViewBag;
// and so on

Usage (like standard helpers):

@Url.Action("Index", "Home")
@Html.Raw("some encoded string")



回答4:


Looks like helpers in App_Code work but you don't have access to standard MVC Html. helpers

see Razor: Declarative HTML helpers




回答5:


Add second Parameter in your helper as bellow

@helper ReplaceCrLf(string strText,HtmlHelper<dynamic> html)
{
    @Html.Raw(html.Encode(strText).Replace(Environment.NewLine, "<br />"));
}

when you use this helper pass this.Html as second Parameter




回答6:


This should be enough:

var message = new HtmlString(toast.Message.Replace(Environment.NewLine, "<br />"))

No need to use Html.Raw().



来源:https://stackoverflow.com/questions/6679618/using-html-inside-shared-helper-in-app-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!