Urlhelper и IActionContextAccessor в ядре .net - PullRequest
0 голосов
/ 05 марта 2019

У меня есть код .net framework 4.5, который я бы хотел перенести в ядро ​​.net:

[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);
        }
    }

Итак, я обнаружил, что для получения текущего контекста мне нужно использовать IActionContextAccessor bu Я изо всех сил пытаюсь получить эквивалентные методы для этого.

Вот что я пробовал до сих пор:

[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);
    }
    }

РЕДАКТИРОВАТЬ 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
    }

Я правильно иду? Потому что я не знаю, что делать с методом UrlHelper.Action(), чтобы получить тот же результат, что и в .net 4.5 ...

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Почти. Вам также нужно ввести IUrlHelperFactory. Тогда:

UrlHelper = urlHelperFactory.GetUrlHelper(actionContext.ActionContext);
0 голосов
/ 06 марта 2019

Хорошо, так что я мог бы найти, как это сделать.Если бы кто-нибудь мог подтвердить, что я делаю правильно, это было бы очень оценено:)

В Startup.cs Я добавил:

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

, тогда мой RouteData.cs станет:

     [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;
            }
        }

и 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
    }

Конечная цель - создать json в начале приложения, который мог бы использоваться командой переднего разработчика в своем ajax и т. Д.они раньше были, и я пытаюсь транспонировать в ядро ​​.net.

вот пример:

enter image description here

...