Asp.net core .net核心中的Urlhelper和IActionContextAccessor

Asp.net core .net核心中的Urlhelper和IActionContextAccessor,asp.net-core,urlhelper,Asp.net Core,Urlhelper,我有一些.net framework 4.5代码要转换为.net core: [DataContract] public class RouteData { public RouteData() { Request = new RequestRouteData(); } [DataMember] public RequestRouteData Request { get; set; }

我有一些.net framework 4.5代码要转换为.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);
        }
    }
因此,我发现要获得当前的上下文,我必须使用
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中相同的结果…

。您还需要注入
IUrlHelperFactory
。然后:

UrlHelper = urlHelperFactory.GetUrlHelper(actionContext.ActionContext);

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

UrlHelper = urlHelperFactory.GetUrlHelper(actionContext.ActionContext);

好的,那么我可能已经找到了这样做的方法。如果有人能证实我做得对,我将不胜感激:)

Startup.cs
中,我添加了:

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

最终目标是在应用程序开始时生成json,前端开发团队可以在ajax等中使用json。。这是他们曾经拥有的东西,我正在尝试转换到.NETCore

以下是一个例子:


好的,我可能已经找到了这样做的方法。如果有人能证实我做得对,我将不胜感激:)

Startup.cs
中,我添加了:

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

最终目标是在应用程序开始时生成json,前端开发团队可以在ajax等中使用json。。这是他们曾经拥有的东西,我正在尝试转换到.NETCore

以下是一个例子:



首先,谢谢你抽出时间,克里斯。正如您所提到的,我修改了代码以注入
IUrlHelperFactory
。不过,我不知道如何获得与旧的
UrlHelper.Action(“AddOtherFields”,“Request”)等价的代码。有什么线索吗?一旦你有了UrlHelper实例,问题是UrlHelper实例似乎总是
null
你最终是如何使用它的?您必须在请求管道内,否则
ActionContext
将为空。如果您希望能够在请求之外生成URL,这在技术上是不可能的。2.1中有
LinkGenerator
,但目前它的功能非常有限。哦,这可能就是为什么它总是为空的原因。我刚刚在第二篇文章中添加了一个印刷品,说明了公司使用的原始代码,我正试图将其转换为.net Core。首先,感谢您的时间,Chris。正如您所提到的,我修改了代码以注入
IUrlHelperFactory
。不过,我不知道如何获得与旧的
UrlHelper.Action(“AddOtherFields”,“Request”)等价的代码。有什么线索吗?一旦你有了UrlHelper实例,问题是UrlHelper实例似乎总是
null
你最终是如何使用它的?您必须在请求管道内,否则
ActionContext
将为空。如果您希望能够在请求之外生成URL,这在技术上是不可能的。2.1中有
LinkGenerator
,但目前它的功能非常有限。哦,这可能就是为什么它总是为空的原因。我刚刚在第二篇文章中添加了一个打印,该公司使用了我试图转换到.net coreWell的原始代码,我认为这很好,但我在构建时不断遇到这个错误:
RouteData.cs(20,50):[CS1003]语法错误,','expected
位于
公共类RequestRoutedData:BaseRoutedData(){…}
您希望如何与
RoutedData一起使用?与我们分享相关的代码,你需要定义一个构造函数,它接受
RequestRouteData
IUrlHelper
,并在
公共类RequestRouteData:BaseRouteData()
@tazhou中删除
()
,很抱歉没有提前给出答案,刚刚被流感困在家里。我更新了原来的帖子,所以你可以看到它将在哪里使用。我们的目标是创建路由并序列化它们,以创建可供前端开发团队访问的json。@TaoZhou但如果我为RequestRoutedata()创建一个接受IUrlHelper的构造函数,我也必须将IUrlHelper注入RouteData()构造函数,对吗?然后在我的JavascriptData()构造函数中。。。?刚刚编辑了上面的帖子来分享这一进步……好吧,我认为这很好,但我在构建时不断遇到这个错误:
RouteData.cs(20,50):[CS1003]语法错误,“
应该位于
公共类RequestRouteData:BaseRouteData(){…}
您想如何使用
RouteData
?与我们分享相关的代码,你需要定义一个构造函数,它接受
RequestRouteData
IUrlHelper
,并在
公共类RequestRouteData:BaseRouteData()
@tazhou中删除
()
,很抱歉没有提前给出答案,刚刚被流感困在家里。我更新了原来的帖子,所以你可以看到它将在哪里使用。我们的目标是创建路由并序列化它们,以创建可供前端开发团队访问的json。@TaoZhou但如果我为RequestRoutedata()创建一个接受IUrlHelper的构造函数,我也必须将IUrlHelper注入RouteData()构造函数,对吗?然后在我的JavascriptData()构造函数中。。。?刚刚编辑了上面的帖子来分享进步。。。