Бритва и HTML-помощники

Я пытаюсь перенести старый помощник HTML.Image, который, я уверен, каждый использовал в какой-то момент, и у меня возникают проблемы. Следующие компилируются:

@Html.Image("my-id", "~/Content/my-img.png", "Alt Text")

Но когда я пытаюсь использовать его в представлении, он просто пишет:

<img alt="Alt Text" id="my-id" src="/content/my-img.png" />

И не отображает изображение. Может ли кто-нибудь помочь?

Вот код хелпера HTML.Image, который я использую:

public static class ImageHelper
{
    public static string Image(this HtmlHelper helper, string id, string url, string alternateText)
    {
        return Image(helper, id, url, alternateText, null);
    }

    public static string Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)
    {
        // Instantiate a UrlHelper 
        var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);

        // Create tag builder
        var builder = new TagBuilder("img");

        // Create valid id
        builder.GenerateId(id);

        // Add attributes
        builder.MergeAttribute("src", urlHelper.Content(url));
        builder.MergeAttribute("alt", alternateText);
        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        // Render tag
        var ret = new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing));
        return ret.ToHtmlString();
    }

}

Ответ 1

Механизм просмотра Razor автоматически выведет строки с поддержкой HTML @ -blocks.
Чтобы отобразить фактический HTML, вам нужно написать реализацию IHtmlString в @ -block.

Измените свой метод, чтобы вернуть HtmlString вместо string.

Ответ 2

    public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText)
    {
        return Image(helper, id, url, alternateText, null);
    }

    public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)
    {
        // Instantiate a UrlHelper 
        var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);

        // Create tag builder
        var builder = new TagBuilder("img");

        // Create valid id
        builder.GenerateId(id);

        // Add attributes
        builder.MergeAttribute("src", urlHelper.Content(url));
        builder.MergeAttribute("alt", alternateText);
        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        // Render tag
        var ret = new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing));

        return ret;
    }

как это было проверено и работает отлично. Мне нужно было что-то вроде этого, чтобы объединить имя изображения с моделью.

и этот тоже работает.

 <img src="@Url.Content("~/Content/Images/Flags/" + c.CountryCode + ".jpg") " alt=""/>

Ответ 3

Я бы попытался обернуть URL-адрес изображения при вызове метода Url Content таким образом

@Url.Content("~/Content/my-img.png")

который должен преобразовать относительный url в абсолютный, когда страница будет сброшена в браузер

Ответ 4

У меня была та же проблема, и я использовал MvcHtmlString в качестве возвращаемого типа для этих 2 методов расширения и работает

public static class ImageHelper
{
    public static MvcHtmlString Image(this HtmlHelper helper, string id, string url, string alternateText)
    {
        return Image(helper, id, url, alternateText, null);
    }

    public static MvcHtmlString Image(this HtmlHelper helper, string id, string url, string alternateText,
                               object htmlAttributes)
    {
        var builder = new TagBuilder("img");

        builder.GenerateId(id);

        builder.MergeAttribute("alt", alternateText);
        builder.MergeAttribute("src",url);

        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
    }
}