首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.net内核中的Urlhelper和IActionContextAccessor

.net内核中的Urlhelper和IActionContextAccessor
EN

Stack Overflow用户
提问于 2019-03-06 04:27:06
回答 2查看 1K关注 0票数 0

我有一些想转置到.net核心的.net Framework4.5代码:

代码语言:javascript
复制
[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,但我很难获得相同的方法来这样做。

这是我到目前为止尝试过的:

代码语言:javascript
复制
[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:

代码语言:javascript
复制
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中相同的结果……

EN

回答 2

Stack Overflow用户

发布于 2019-03-06 04:32:09

差不多了。您还需要注入IUrlHelperFactory。然后:

代码语言:javascript
复制
UrlHelper = urlHelperFactory.GetUrlHelper(actionContext.ActionContext);
票数 2
EN

Stack Overflow用户

发布于 2019-03-06 05:12:13

好的,所以我可能已经找到了方法。如果有人能确认我做得对,我将不胜感激:)

Startup.cs中,我添加了:

代码语言:javascript
复制
services.AddScoped(sp => {
                var actionContext = sp.GetRequiredService<IActionContextAccessor>().ActionContext;
                var urlHelperFactory = sp.GetRequiredService<IUrlHelperFactory>();
                return urlHelperFactory.GetUrlHelper(actionContext);
            });

然后我的RouteData.cs就变成了:

代码语言:javascript
复制
     [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():

代码语言:javascript
复制
[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核心。

下面是一个示例:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55011025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档