I am writing my own HtmlHelper extenstion for ASP.NET MVC:
public static string CreateDialogLink (this HtmlHelper htmlHelper, string linkText, string contentPath) { // fix up content path if the user supplied a path beginning with '~' contentPath = Url.Content(contentPath); // doesn't work (see below for why) // create the link and return it // ..... };
Where I am having trouble is tryin to access UrlHelper from within my HtmlHelper’s definition. The problem is that the way you normally access HtmlHelper (via Html.MethodName(...) ) is via a property on the View. This isn’t available to me obviously from with my own extension class.
This is the actual MVC source code for ViewMasterPage (as of Beta) – which defines Html and Url.
public class ViewMasterPage : MasterPage { public ViewMasterPage(); public AjaxHelper Ajax { get; } public HtmlHelper Html { get; } public object Model { get; } public TempDataDictionary TempData { get; } public UrlHelper Url { get; } public ViewContext ViewContext { get; } public ViewDataDictionary ViewData { get; } public HtmlTextWriter Writer { get; } }
I want to be able to access these properties inside an HtmlHelper.
The best I’ve come up with is this (insert at beginning of CreateDialogLink method)
HtmlHelper Html = new HtmlHelper(htmlHelper.ViewContext, htmlHelper.ViewDataContainer); UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
Am I missing some other way to access the existing HtmlHelper and UrlHelper instances – or do i really need to create a new one? I’m sure there isn’t much overhead but I’d prefer to use the preexisting ones if I can.
Before asking this question I had looked at some of the MVC source code, but evidently I missed this, which is how they do it for the Image helper.
Looks like instantiating a new
UrlHelperis the correct approach after all. Thats good enough for me.Update: RTM code from ASP.NET MVC v1.0 Source Code is slightly different as pointed out in the comments.
File: MVC\src\MvcFutures\Mvc\ImageExtensions.cs