Urlhelper and IActionContextAccessor in .net core

1.7k views Asked by At

I have some .net framework 4.5 code that I'd like to transpose to .net core :

[DataContract]
    public class RouteData
    {
        public RouteData()
        {
            Request = new RequestRouteData();
        }

        [DataMember] public RequestRouteData Request { get; set; }
    }

    public class RequestRouteData : BaseRouteData
    {
        [DataMember]
        public string AddUploadOtherFileStep5
        {
            get { return UrlHelper.Action("AddOtherFields", "Request"); }
        }
    }


    public class BaseRouteData
    {
        protected UrlHelper UrlHelper { get; set; }

        protected BaseRouteData()
        {
            UrlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
        }
    }

So, I found out that to get the current context I have to use IActionContextAccessor bu I'm struggling getting the equivalent methods to do so.

Here is what I tried so far :

[DataContract]
    public class RouteData
    {
        public RouteData()
        {
            Request = new RequestRouteData();
        }

        [DataMember] public RequestRouteData Request { get; set; }
    }

    public class RequestRouteData : BaseRouteData()
    {
        [DataMember] public string AddOtherFields => UrlHelper.Action(What to put here?);
    }


    public class BaseRouteData
    {
        protected UrlHelper UrlHelper { get; }

        protected BaseRouteData(IActionContextAccessor actionContext, IUrlHelperFactory urlHelperFactory)
    {
        UrlHelper = (UrlHelper) urlHelperFactory.GetUrlHelper(actionContext.ActionContext);
    }
    }

EDIT 3 :

public class JavascriptData
    {
        public JavascriptData()
        {
            Routes = new RouteData();
        }

        [DataMember] public RouteData Routes { get; set; }

        #region ScriptFactory

        public static string ScriptFactory()
        {
            var serializerSettings = new JsonSerializerSettings();
            serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            var script = new StringBuilder();
            JavascriptData appData = new JavascriptData();
            var text = JsonConvert.SerializeObject(appData, Formatting.Indented, serializerSettings);
            script.AppendFormat("var appData={0}", text);
            return script.ToString();
        }

        #endregion
    }

Am I heading right? Because I don't know what to do with the UrlHelper.Action() method to get the same result as in .net 4.5...

2

There are 2 answers

6
Chris Pratt On

Almost. You need to inject IUrlHelperFactory as well. Then:

UrlHelper = urlHelperFactory.GetUrlHelper(actionContext.ActionContext);
4
j0w On

Ok, so I may have found how to do so. If aanyone can confirm I am doing right it would be verry appreciated :)

In Startup.cs I added :

services.AddScoped(sp => {
                var actionContext = sp.GetRequiredService<IActionContextAccessor>().ActionContext;
                var urlHelperFactory = sp.GetRequiredService<IUrlHelperFactory>();
                return urlHelperFactory.GetUrlHelper(actionContext);
            });

then my RouteData.cs becomes :

     [DataContract]
        public class RouteData
        {
            public RouteData(IUrlHelper iUrlHelper)
            {
                Request = new RequestRouteData(iUrlHelper);
            }
            [DataMember] public RequestRouteData Request { get; set; }
        }

        public class RequestRouteData : BaseRouteData
        {
            public RequestRouteData(IUrlHelper iUrlHelper) : base(iUrlHelper)
            {
            }
            [DataMember] 
public string AddOtherFields => UrlHelper.Action("AddOtherFields", "Request");
        }


        public class BaseRouteData
        {
            protected UrlHelper UrlHelper { get; }
            protected BaseRouteData(IUrlHelper iUrlHelper)
            {
                UrlHelper = iUrlHelper as UrlHelper;
            }
        }

and the Javascriptdata() :

[DataContract]
    public class JavascriptData
    {
        private static IUrlHelper _iUrlHelper;
        public JavascriptData(IUrlHelper iUrlHelper)
        {
            _iUrlHelper = iUrlHelper;
            Routes = new RouteData(_iUrlHelper);
        }

        [DataMember] public RouteData Routes { get; set; }

        #region ScriptFactory

        public static string ScriptFactory()
        {
            var serializerSettings = new JsonSerializerSettings();
            serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            var script = new StringBuilder();
            JavascriptData appData = new JavascriptData(_iUrlHelper);
            var text = JsonConvert.SerializeObject(appData, Formatting.Indented, serializerSettings);
            script.AppendFormat("var appData={0}", text);
            return script.ToString();
        }

        #endregion
    }

The end goal is to generate a json at the start of the application, that could be used by the front dev team in their ajax etc.. it's something they used to have and i'm trying to transpose to .net core.

here is an example :

enter image description here