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)
It is possible to get helpers from the PageContext:
Usage (like standard helpers):
I add this to any .cshtml files in App_Code now.
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
In View:
Looks like helpers in App_Code work but you don't have access to standard MVC Html. helpers
see Razor: Declarative HTML helpers
This should be enough:
No need to use
Html.Raw().
I used a workaround like following
Add second Parameter in your helper as bellow
when you use this helper pass this.Html as second Parameter