views:

395

answers:

1

I want to write an HtmlHelper to render an ActionLink with pre-set values, eg.

<%=Html.PageLink("Page 1", "page-slug");%>

where PageLink is a function that calls ActionLink with a known Action and Controller, eg. "Index" and "Page".

Since HtmlHelper and UrlHelper do not exist inside a Controller or class, how do I get the relative URL to an action from inside a class?

+3  A: 

Not sure I actually understood your question clearly, but, let me try.

To create a HtmlHelper extension like you described, try something like:

using System;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace Something {
    public static class PageLinkHelper
    {
        public static string PageLink(
            this HtmlHelper helper,
            string linkText, string actionName,
            string controllerName, object routeValues,
            object htmlAttributes)
        {
            return helper.ActionLink(
                linkText, actionName, controllerName,
                routeValues, htmlAttributes);
        }
    }
}

As for your question on getting a URL from a class, depends on what kind of class you'll implement it. For example, if you want to get the current controller and action from a HtmlHelper extension, you can use:

string currentControllerName = (string)helper.ViewContext
    .RouteData.Values["controller"];
string currentActionName = (string)helper.ViewContext
    .RouteData.Values["action"];

If you want to get it from a controller, you can use properties/methods from the base class (Controller) to build the URL. For example:

var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(an_action_name, route_values);
jweyrich
Excellent answer. I tried that without a wrapping it in a static class and it wouldn't register helper.ActionLink(...). Thanks.
FreshCode
Ah, and I wasn't importing System.Web.Mvc; My bad.
FreshCode