Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在asp.net核心mvc html helper静态方法中从html helper上下文获取urlHelper_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 如何在asp.net核心mvc html helper静态方法中从html helper上下文获取urlHelper

C# 如何在asp.net核心mvc html helper静态方法中从html helper上下文获取urlHelper,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我在ASP.NET 5 RC1中有一个项目,我使用该项目从HtmlHelper静态方法中的HtmlHelper上下文获取urlHelper public static IHtmlContent MyHtmlHelperMethod<TModel, TResult>( this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TResult&g

我在
ASP.NET 5 RC1
中有一个项目,我使用该项目从HtmlHelper静态方法中的HtmlHelper上下文获取urlHelper

    public static IHtmlContent MyHtmlHelperMethod<TModel, TResult>(
            this IHtmlHelper<TModel> htmlHelper,
            Expression<Func<TModel, TResult>> expression)
    {



       //get the context from the htmlhelper and use it to get the urlHelper as it isn't passed to the method from the view
        var urlHelper = GetContext(htmlHelper).RequestServices.GetRequiredService<IUrlHelper>();

        var controller = htmlHelper.ViewContext.RouteData.Values["controller"].ToString();
        string myLink;
        if (htmlHelper.ViewContext.RouteData.Values["area"] == null)
        {
            myLink= urlHelper.Action("index", controller);

        } else
        {

            string area = htmlHelper.ViewContext.RouteData.Values["area"].ToString();
            myLink = urlHelper.Action("index", controller, new { area = area });

        }  
        string output = "<div><a href = \"" + myLink + "\" class=\"myclass\"><blabla></blabla>My Link</a></div>;
        return new HtmlString(output.ToString());
    }
stackoverflow answer中发布的解决方案是注入
IUrlHelperFactory
,但是我使用的是在
cshtml
中调用的静态html助手方法,而不是标记助手中使用的类


如何将代码更改为在ASP.net Core中工作?

将原始代码更改为:

var urlHelperFactory = GetContext(htmlHelper).RequestServices.GetRequiredService<IUrlHelperFactory>();
var actionContext = GetContext(htmlHelper).RequestServices.GetRequiredService<IActionContextAccessor>().ActionContext;
var urlHelper = urlHelperFactory.GetUrlHelper(actionContext); 
var urlHelperFactory=GetContext(htmlHelper).RequestServices.GetRequiredService();
var actionContext=GetContext(htmlHelper).RequestServices.GetRequiredService().actionContext;
var urlHelper=urlHelperFactory.GetUrlHelper(actionContext);

微软可能在.NETCore2.1中移动了一些东西。这比公认的答案稍微简单一些。我希望这对某人有帮助

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.Extensions.DependencyInjection;

namespace MyApp.Extensions
{
    public static class WebApiHelperExtension
    {
        public static IHtmlContent WebApiUrl(this IHtmlHelper htmlHelper)
        {
            var urlHelperFactory = htmlHelper.ViewContext.HttpContext.RequestServices.GetRequiredService<IUrlHelperFactory>();
            var urlHelper = urlHelperFactory.GetUrlHelper(htmlHelper.ViewContext);
            //...
        }
    }
}
使用Microsoft.AspNetCore.Html;
使用Microsoft.AspNetCore.Mvc.Rendering;
使用Microsoft.AspNetCore.Mvc.Routing;
使用Microsoft.Extensions.DependencyInjection;
命名空间MyApp.Extensions
{
公共静态类WebApiHelperExtension
{
公共静态IHtmlContent WebApiUrl(此IHtmlHelper htmlHelper)
{
var urlHelperFactory=htmlHelper.ViewContext.HttpContext.RequestServices.GetRequiredService();
var urlHelper=urlHelperFactory.GetUrlHelper(htmlHelper.ViewContext);
//...
}
}
}

感谢您提供的解决方案,但我不得不说它并不漂亮,我希望asp.net core开发人员能够简化这一过程。我不知道这是否是一个新的.net core 2.1版本,但以上内容现在让我产生了一个错误,即IActionContextAccessor未注册。请参阅下面我的答案,现在只剩下两行代码。是的,但是你从哪里得到htmlhelper实例呢?它是通过DependencyInjection自动传入的,所以你不需要得到它。您可以从.cshtml文件调用该函数,而无需参数:
@Html.WebApiUrl()
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.Extensions.DependencyInjection;

namespace MyApp.Extensions
{
    public static class WebApiHelperExtension
    {
        public static IHtmlContent WebApiUrl(this IHtmlHelper htmlHelper)
        {
            var urlHelperFactory = htmlHelper.ViewContext.HttpContext.RequestServices.GetRequiredService<IUrlHelperFactory>();
            var urlHelper = urlHelperFactory.GetUrlHelper(htmlHelper.ViewContext);
            //...
        }
    }
}