Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AspNetCore get path to wwwroot in TagHelper

I try to create a TagHelper that checks for the existence of an image and if it is not there replaces the path to a default image.

Unfortunately I have problems to map the "~" symbol in my tag helper.

For example. My src of the image contains "~\images\image1.png". Now I want to check for existence of this file and if not replace it by another one from an attribute of the tag. I am stuck at mapping the "~" to wwwroot of my application.

This is what I have actually:

[HtmlTargetElement("img", TagStructure = TagStructure.WithoutEndTag)]
public class ImageTagHelper : TagHelper
{
    public ImageTagHelper(IHostingEnvironment environment)
    {
        this._env = environment;
    }

    private IHostingEnvironment _env;

    public string DefaultImageSrc { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
    //    urlHelper.ActionContext.HttpContext.
    //var env = ViewContext.HttpContext.ApplicationServices.GetService(typeof(IHostingEnvironment)) as IHostingEnvironment;

        string imgPath = context.AllAttributes["src"].Value.ToString();

        if (!File.Exists(_env.WebRootPath + imgPath)) {
            output.Attributes.SetAttribute("src", _env.WebRootPath + DefaultImageSrc);
        }
    }

}
like image 226
HugoHiasl Avatar asked Oct 12 '16 14:10

HugoHiasl


People also ask

What is the difference between Htmlhelper and Taghelper?

HtmlHelpers vs. Unlike HtmlHelpers, a tag helper is a class that attaches itself to an HTML-compliant element in a View or Razor Page. The tag helper can, through its properties, add additional attributes to the element that a developer can use to customize the tag's behavior.

Can we use tag helpers in MVC 5?

No, tag helpers are only supported in ASP.NET Core, not in the older ASP.NET (based on the classic . NET Framework, rather than the newer . NET Core). But instead you can use HTML Helpers which do a lot of the same things.

What is Microsoft ASP.NET Core MVC TagHelpers?

Microsoft. AspNetCore. Mvc. TagHelpers is the assembly for the built-in ASP.NET Core Tag Helpers.

What is ASP route?

asp-route. The asp-route attribute is used for creating a URL linking directly to a named route. Using routing attributes, a route can be named as shown in the SpeakerController and used in its Evaluations action: C# Copy.


2 Answers

You should take a constructor dependency on IUrlHelperFactor and IActionContextAccessor which will enable you to get an IUrlHelper that can resolve urls from wwwroot with the "~/" syntax

public ImageTagHelper(
    IUrlHelperFactory urlHelperFactory,
    IActionContextAccessor actionContextAccesor,)
{
    this.urlHelperFactory = urlHelperFactory;
    this.actionContextAccesor = actionContextAccesor;
}

private IUrlHelperFactory urlHelperFactory;
private IActionContextAccessor actionContextAccesor;

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    var urlHelper = urlHelperFactory.GetUrlHelper(actionContextAccesor.ActionContext);
    var myUrl = urlHelper.Content("~/somefilebelowwwwroot");
    ...
}

you can see I'm doing that in my PagerTagHelper

like image 53
Joe Audette Avatar answered Oct 19 '22 02:10

Joe Audette


It needs an addition in the ConfigureServices method in the Startup.cs

You need to add the following lines:

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

And then this works:

   [HtmlTargetElement("img", TagStructure = TagStructure.WithoutEndTag)]
    public class ImageTagHelper : TagHelper
    {
        public ImageTagHelper(IUrlHelperFactory urlHelperFactory,
                              IActionContextAccessor actionContextAccessor,
                              IHostingEnvironment environment)
        {
            _urlHelperFactory = urlHelperFactory;
            _actionContextAccessor = actionContextAccessor;
            _env = environment;
        }

        private IUrlHelperFactory _urlHelperFactory;
        private IActionContextAccessor _actionContextAccessor;

        private IHostingEnvironment _env;

        public string DefaultImageSrc { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            string imgPath = context.AllAttributes["src"].Value.ToString();

            IUrlHelper urlHelper = _urlHelperFactory.GetUrlHelper(_actionContextAccessor.ActionContext);

            if (!imgPath.StartsWith("data:"))
            {
                if (!File.Exists(_env.WebRootPath + urlHelper.Content(imgPath)))
                {
                    if (DefaultImageSrc != null)
                    {
                        output.Attributes.SetAttribute("src", urlHelper.Content(DefaultImageSrc));
                    }
                }
            }
        }

    }
like image 44
HugoHiasl Avatar answered Oct 19 '22 02:10

HugoHiasl