2009-02-27 1 views
296

В последней версии (RC1) ASP.NET MVC, как мне получить Html.ActionLink для рендеринга как кнопки или изображения вместо ссылки?Html.ActionLink как кнопка или изображение, а не ссылка

+12

С MVC 3.0 вы можете попробовать этот путь Home Дополнительная информация, Попробуйте это http://mycodingerrors.blogspot.com/2012/08/actionlink-with-image-in-aspnet-mvc-3.html – lasantha

+0

Просто потратив несколько часов делают это «правильно» (например, путем расширения 'AjaxHelper' с помощью' ActionButton'), я думал, что поделился бы им ниже. –

+4

Мне смешно, что через семь лет этот вопрос по-прежнему поднимается. По-видимому, в 2016 году все еще нет простого, интуитивного способа сделать это. –

ответ

310

Поздний отклик, но вы можете просто сохранить его простым и применить класс CSS к объекту htmlAttributes.

<%= Html.ActionLink("Button Name", "Index", null, new { @class="classname" }) %> 

, а затем создать класс в таблице стилей

a.classname 
{ 
    background: url(../Images/image.gif) no-repeat top left; 
    display: block; 
    width: 150px; 
    height: 150px; 
    text-indent: -9999px; /* hides the link text */ 
} 
+2

Это отлично работает для меня, хотя вам может потребоваться заменить null объектом routeValues ​​в зависимости от того, к чему вы привязываетесь. –

+4

+1 потому что он доступен/SEO дружественный –

+1

Как вы обрабатываете строку имени кнопки, которую вы назначаете в параметре ссылки на действие. Это не сработало для меня. – ZVenue

12

Вы не можете сделать это с помощью Html.ActionLink. Вы должны использовать Url.RouteUrl и использовать URL-адрес для создания нужного элемента.

+0

Привет, извините, я очень новичок в MVC. Как использовать Url.RouteURL для достижения имиджа? – uriDium

+0

Я имел в виду, что вы не можете создать вложенный тег img (или тег кнопки) простым вызовом ActionLink. Конечно, CSS-стиль самого тега - это способ обойти его, но тем не менее вы не можете получить тег img. –

4

Сделайте то, что говорит Мехрдад, или воспользуйтесь помощником URL из метода расширения HtmlHelper, такого как Стивен Вальтер, который описывает here и создает собственный метод расширения, который можно использовать для визуализации всех ваших ссылок.

Тогда будет легко отобразить все ссылки в виде кнопок/якорей или в зависимости от того, что вы предпочитаете - и, самое главное, вы можете изменить свое мнение позже, когда узнаете, что вы действительно предпочитаете какой-либо другой способ сделать ваши ссылки.

8

Даже позже ответ, но я столкнулся с подобным вопросом и в конечном итоге написание моей Image link HtmlHelper extension.

Вы можете найти его реализацию в своем блоге по ссылке выше.

Просто добавлено в случае, если кто-то ищет реализацию.

+1

выглядит классно, но что это за ссылка «LinkBuilder»? –

+0

Ссылка больше не работает. – dvallejo

+0

Ссылка сейчас неактивна – d219

325

Мне нравится использовать Url.Action() и Url.Content(), как это:

<a href='@Url.Action("MyAction", "MyController")'> 
    <img src='@Url.Content("~/Content/Images/MyLinkImage.png")' /> 
</a> 

Строго говоря, Url.Content только необходим для Pathing не является частью ответа на ваш вопрос.

Благодаря @BrianLegg, указав, что это должно использовать новый синтаксис вида Razor. Пример был соответствующим образом обновлен.

+0

Если вы хотите получить html-помощник для этого: http://www.fsmpi.uni-bayreuth.de/~dun3/archives/asp-net-mvc-3-html-actionlink-image- imageactionlink-improved/483.html –

+6

Это прекрасно работает. Просто отметьте, что в MVC5 синтаксис изменился и должен быть и . Спасибо – BrianLegg

+0

Спасибо, что указали это. Обновлен пример. – jslatts

0

Url.Action() поможет вам голую URL для большинства перегрузок Html.ActionLink, но я думаю, что URL-from-lambda функциональности доступна только через Html.ActionLink до сих пор. Надеюсь, в какой-то момент они добавят подобную перегрузку в Url.Action.

49

Позвоните мне упрощенным, но я просто делаю:

<a href="<%: Url.Action("ActionName", "ControllerName") %>"> 
    <button>Button Text</button> 
</a> 

И вы просто заботиться о гиперссылке изюминкой. Наши пользователи любят это :)

+1

Не работал для меня. В то же время он просто подал форму. – Slider345

+1

@ Одна из причин, по которой это не так много голосов, ответили так много позже, чем другие ответы. Я собирался проголосовать, но проверял, что сказал @ Slider345 и может подтвердить, что это не работает по желанию в IE 7 или 8. В любом случае, если вы решите использовать его, не забудьте установить css ссылку (наведение и активный) на «text-decoration: none», чтобы избавиться от этой глупой подчеркивания. Это необходимо для некоторых браузеров (наверняка, Firefox 11.0). – Yetti

+22

Но вы не должны вставлять кнопки внутри элементов, наоборот. По крайней мере, это недействительный способ сделать это в HTML 5 –

1
@using (Html.BeginForm("DeleteMember", "Member", new { id = Model.MemberID })) 
    { 
     <input type="submit" value="Delete Member" onclick = "return confirm('Are you sure you want to delete the member?');" /> 
    } 
14

Просто:

<button onclick="@Url.Action("index", "Family", new {familyid = Model.FamilyID })">Cancel</button> 
+0

это все еще вызывает почтовый метод представления для меня, любая идея почему? – DevDave

+0

Это недопустимый синтаксис. IE10 выдает критическую ошибку JavaScript с этой строкой: «SCRIPT5017: ошибка синтаксиса в регулярном выражении». –

+0

Хороший ответ, но без окружающего содержимого 'onclick' с' location.href' (так что 'onclick =" location.href = '@ Url.Action (....)' "') Я не мог получить его Работа. – SharpC

8

<button onclick="location.href='@Url.Action("NewCustomer", "Customers")'">Checkout >></button>

+0

Это работало для меня на IE10. Это хорошее решение, если вы просто хотите использовать кнопку, а не изображение, хотя использование использования встроенного JavaScript для простой ссылки, вероятно, не идеально. –

+1

(и, конечно, я тестировал его на Opera, Safari, Chrome и Firefox, и он работал) –

0

так, как я сделал это, чтобы иметь ActionLink и изображение отдельно. Установите изображение actionlink как скрытое , а затем добавьте триггерный вызов jQuery. Это более обходное решение.

'<%= Html.ActionLink("Button Name", "Index", null, new { @class="yourclassname" }) %>' 
<img id="yourImage" src="myImage.jpg" /> 

Trigger пример:

$("#yourImage").click(function() { 
    $('.yourclassname').trigger('click'); 
}); 
81

заимствование от ответа Патрика, я обнаружил, что я должен был сделать это:

<button onclick="location.href='@Url.Action("Index", "Users")';return false;">Cancel</button> 

, чтобы избежать вызова метода после формы.

1

Существует, как представляется, множество решений о том, как создать ссылку, которая отображается как изображение, но ни одна из них не может казаться кнопкой.

Существует только хороший способ, который я нашел для этого. Он немного взломан, но он работает.

Что вам нужно сделать, это создать кнопку и отдельную ссылку для действий. Сделать ссылку действия невидимой с помощью css. Когда вы нажимаете на кнопку, она может запускать событие щелчка ссылки действия.

<input type="button" value="Search" onclick="Search()" /> 
@Ajax.ActionLink("Search", "ActionName", null, new AjaxOptions {}, new { id = "SearchLink", style="display:none;" }) 

function Search(){ 
    $("#SearchLink").click(); 
} 

Это может быть боль в заднице, чтобы сделать это каждый раз, когда вы добавляете ссылку, которая должна выглядеть как кнопка, но это достичь желаемого результата.

12

Поздний ответ, но это то, как я делаю свой ActionLink кнопкой. Мы используем Bootstrap в нашем проекте, так как это делает его удобным. Не обращайте внимания на @T, поскольку мы используем только переводчика.

@Html.Actionlink("Some_button_text", "ActionMethod", "Controller", "Optional parameter", "html_code_you_want_to_apply_to_the_actionlink"); 

выше дает ссылку, как это и выглядит, как на картинку ниже:

localhost:XXXXX/Firms/AddAffiliation/F0500 

picture demonstrating button with bootstrap

На моем взгляде:

@using (Html.BeginForm()) 
{ 
<div class="section-header"> 
    <div class="title"> 
     @T("Admin.Users.Users") 
    </div> 
    <div class="addAffiliation"> 
     <p /> 
     @Html.ActionLink("" + @T("Admin.Users.AddAffiliation"), "AddAffiliation", "Firms", new { id = (string)@WorkContext.CurrentFirm.ExternalId }, new { @class="btn btn-primary" }) 
    </div> 
</div> 

} 

Надеется, что это помогает кому-нибудь

+0

Работает круто! красивый и простой, htmlAttribute 'new {@ class =" btn btn-primary "})' + one – Irfan

13

, если вы не хотите использовать ссылку, используйте кнопку. Вы можете добавить изображение на кнопку, а также:

<button type="button" onclick="location.href='@Url.Action("Create", "Company")'" > 
    Create New 
    <img alt="New" title="New" src="~/Images/Button/plus.png"> 
</button> 

тип = «кнопка» выполняет свое действие вместо отправки формы.

5
<li><a href="@Url.Action( "View", "Controller")"><i class='fa fa-user'></i><span>Users View</span></a></li> 

Чтобы отобразить иконку со ссылкой

1

использования FORMACTION

<input type="submit" value="Delete" formaction="@Url.Action("Delete", new { id = Model.Id })" /> 
0

Это, как я сделал это без сценариев:

@using (Html.BeginForm("Action", "Controller", FormMethod.Get)) 
{ 
    <button type="submit" 
      class="btn btn-default" 
      title="Action description">Button Label</button> 
} 

То же, но с параметром и подтверждения Диалог:

@using (Html.BeginForm("Action", "Controller", 
     new { paramName = paramValue }, 
     FormMethod.Get, 
     new { onsubmit = "return confirm('Are you sure?');" })) 
{ 
    <button type="submit" 
      class="btn btn-default" 
      title="Action description">Button Label</button> 
} 
3

вы можете создать свой собственный метод расширения
тейк посмотреть на моей реализации

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString ActionImage(this HtmlHelper html, string action, object routeValues, string imagePath, string alt, object htmlAttributesForAnchor, object htmlAttributesForImage) 
    { 
     var url = new UrlHelper(html.ViewContext.RequestContext); 

     // build the <img> tag 
     var imgBuilder = new TagBuilder("img"); 
     imgBuilder.MergeAttribute("src", url.Content(imagePath)); 
     imgBuilder.MergeAttribute("alt", alt); 
     imgBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributesForImage)); 
     string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing); 

     // build the <a> tag 
     var anchorBuilder = new TagBuilder("a"); 
     anchorBuilder.MergeAttribute("href", action != null ? url.Action(action, routeValues) : "#"); 
     anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside 
     anchorBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributesForAnchor)); 

     string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal); 
     return MvcHtmlString.Create(anchorHtml); 
    } 
} 

затем использовать его на ваш взгляд, берут взглянуть на мой призыв

@Html.ActionImage(null, null, "../../Content/img/Button-Delete-icon.png", Resource_en.Delete, 
       new{//htmlAttributesForAnchor 
        href = "#", 
        data_toggle = "modal", 
        data_target = "#confirm-delete", 
        data_id = user.ID, 
        data_name = user.Name, 
        data_usertype = user.UserTypeID 
       }, new{ style = "margin-top: 24px"}//htmlAttributesForImage 
        ) 
5

Использование начальной загрузки это самый короткий и самый чистый подход для создания ссылки на действие контроллера, которое отображается как динамическая кнопка:

<a href='@Url.Action("Action", "Controller")' class="btn btn-primary">Click Me</a> 

Или использовать Html помощникам:

@Html.ActionLink("Click Me", "Action", "Controller", new { @class = "btn btn-primary" }) 
2

Простой способ сделать сделать свой Html.ActionLink в кнопку (до тех пор, пока у вас есть Bootstrap подключен - что вы, вероятно, есть), как это:

@Html.ActionLink("Button text", "ActionName", "ControllerName", new { @class = "btn btn-primary" })