7

I am adding a WebForm from which I would like to resolve routes to URLs. For example, in MVC I would just use

return RedirectToAction("Action", "Controller");

So, if you have a way of getting to that same URL from a WebForm in the same application, it would be appreciated.

oglester
  • 6,605
  • 8
  • 43
  • 63

4 Answers4

15

Try something like this in your Webform:

<% var requestContext = new System.Web.Routing.RequestContext(
       new HttpContextWrapper(HttpContext.Current),
       new System.Web.Routing.RouteData());
   var urlHelper = new System.Web.Mvc.UrlHelper(requestContext); %>

<%= urlHelper.RouteUrl(new { controller = "Controller", action = "Action" }) %>
eu-ge-ne
  • 28,023
  • 6
  • 71
  • 62
4

Revised version of the code above for PageCommon ... as it currently is it breaks.

public static class MvcPages{
public static UrlHelper GetUrlHelper(this System.Web.UI.Control c)
{
    var helper = new System.Web.Mvc.UrlHelper(c.Page.Request.RequestContext);
    return helper;
}

public static HtmlHelper GetHtmlHelper(this System.Web.UI.Control c)
{
    var httpContext = new HttpContextWrapper(HttpContext.Current);
    var controllerContext = new ControllerContext(httpContext, new RouteData(), new DummyController());
    var viewContext = new ViewContext(controllerContext, new WebFormView(controllerContext, "View"), new ViewDataDictionary(), new TempDataDictionary(), TextWriter.Null);

    var helper = new HtmlHelper(viewContext, new ViewDataBag());
    return helper;
} 

private class ViewDataBag : IViewDataContainer
{
    ViewDataDictionary vdd = new ViewDataDictionary();
    public ViewDataDictionary ViewData
    {
        get
        {
            return vdd;
        }
        set
        {
            vdd = value;
        }
    }
}

private class DummyController : Controller
{

}

}
Lynn Eriksen
  • 244
  • 1
  • 2
  • This was unsuccessful for me. I created class MvcPages. And then I added the snippet on MasterPage.master. `<%= this.GetHtmlHelper().Partial("Error") %>` and received an InvalidOperationException. – Michael R May 18 '15 at 23:41
1

If you want to stay away from any MVC dependencies then this is the solution I came up with. It's very close to the accepted answer. I have a class my webform pages inherit and this UrlHelper is available in the ASPX pages.

using System.Net.Http;
using System.Web;
using System.Web.Http.Routing;

public class ClassOtherPagesInherit {
    public UrlHelper Url = new UrlHelper(new HttpRequestMessage(new HttpMethod(HttpContext.Current.Request.HttpMethod), HttpContext.Current.Request.Url));
}

Then you can call this UrlHelper object like this

<%Url.Route("string", new {}) %>
Luminous
  • 1,771
  • 2
  • 24
  • 43
0

For those looking for an actual HtmlHelper or a cleaner way to use the urlHelper in a page:

public static class PageCommon
{
    public static System.Web.Mvc.UrlHelper GetUrlHelper(this System.Web.UI.Control c)
    {
        var helper = new System.Web.Mvc.UrlHelper(c.Page.Request.RequestContext);
        return helper;
    }
    class ViewDataBag : IViewDataContainer
    {
        ViewDataDictionary vdd = new ViewDataDictionary();
        public ViewDataDictionary ViewData
        {
            get
            {
                return vdd;
            }
            set
            {
                vdd = value;
            }
        }
    }
    public static System.Web.Mvc.HtmlHelper GetHtmlHelper(this System.Web.UI.Control c)
    {

        var v = new System.Web.Mvc.ViewContext();
        var helper = new System.Web.Mvc.HtmlHelper(v, new ViewDataBag());
        return helper;
    }
}
Maslow
  • 18,464
  • 20
  • 106
  • 193
  • This was unsuccessful for me. I created class PageCommon class. And then I added the snippet on MasterPage.master. `<%= this.GetHtmlHelper().Partial("Error") %>` and received an ArgumentNullException. – Michael R May 18 '15 at 23:47