Как создать ActionImage из CSS Sprite - PullRequest
0 голосов
/ 26 января 2012

Это продолжение моего предыдущего вопроса: Как вы отображаете области на значках с кнопками?

Я решил создать собственное расширение HtmlHelper, чтобы создатьссылка ActionImage, поэтому я разобрал некоторые популярные расширения, размещенные на SO, и получил следующее:

// Controller/Action Image Link
public static MvcHtmlString ActionImage(this HtmlHelper html, 
    string controller, string action, object routeValues, 
    string imageSrc, string alternateText, object imageAttributes)
{
    UrlHelper url = new UrlHelper(html.ViewContext.RequestContext);

    // build the <img> tag
    TagBuilder imgBuilder = new TagBuilder("img");
    imgBuilder.MergeAttribute("src", url.Content(imageSrc));
    imgBuilder.MergeAttribute("alternateText", alternateText);
    string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);

    // build the <a> tag
    TagBuilder anchorBuilder = new TagBuilder("a");
    anchorBuilder.MergeAttribute("href", url.Action(action, controller, routeValues));
    anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
    string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);

    return MvcHtmlString.Create(anchorHtml);
}

Теперь проблема в том, что у меня есть CSS Sprite, и я не знаю, какзаставить его работать с методом расширения ActionImage:

@Html.ActionImage("Account", "LogOn", null, Sprite.Image("~/App_Sprites/twitterlogin.png"), "", null)

Я попытался вызвать метод ToString() спрайта, но он не возвращает URL.Есть ли другой способ сделать это?

1 Ответ

2 голосов
/ 26 января 2012

Вы можете передать только путь к спрайту:

@Html.ActionImage(
    "Account", 
    "LogOn", 
    null, 
    "~/App_Sprites/twitterlogin.png", 
    "", 
    null
)

, а затем попросите помощника позаботиться о создании изображения с помощью помощника Sprite.Image:

public static MvcHtmlString ActionImage(this HtmlHelper html, 
    string controller, string action, object routeValues, 
    string imageSrc, string alternateText, object imageAttributes)
{
    UrlHelper url = new UrlHelper(html.ViewContext.RequestContext);

    // build the <img> tag
    string img = Sprite.Image(imageSrc).ToHtmlString();

    // build the <a> tag
    TagBuilder anchorBuilder = new TagBuilder("a");
    anchorBuilder.MergeAttribute("href", url.Action(action, controller, routeValues));
    anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
    string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);

    return MvcHtmlString.Create(anchorHtml);
}
...