Html.Action Посилання як кнопка чи зображення, а не посилання


326

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


13
З MVC 3.0 ви можете спробувати такий спосіб <a href="@Url.Action("Index","Home")"> <img src = "@ Url.Content (" ~ / теми / золото / зображення / спробувати-onit .png ")" alt = "Головна" /> </a> Більше інформації. Спробуйте це mycodingerrors.blogspot.com/2012/08/…
lasantha

Провівши кілька годин, роблячи це "належним чином" (наприклад, подовживши AjaxHelperйого ActionButton), я подумав, що поділюсь ним нижче.
Пройшов кодування

5
Мені весело, що через сім років це питання все ще стає актуальним. Мабуть, у 2016 році досі немає простого, інтуїтивного способу зробити це.
Райан Лунді

Відповіді:


330

Запізнення на відповідь, але ви можете просто простий і застосувати клас 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, залежно від того, де ви посилаєтесь.
Девід Конліск

1
Як ви обробляєте рядок імені Кнопки, який ви призначаєте в параметрі посилання дії тоді. Це для мене не вийшло.
ZVenue

1
Та ж проблема, і для мене параметр linkText не може бути нульовим або порожнім рядком, проте я шукаю заміну кнопки зображення.
Ant Antift

5
це погано різними способами, його доза працює не у всіх браузерах, і ви використовуєте побічний ефект як функціонал. відьма робить це дуже поганою практикою, не використовуйте. Тільки тому, що це працює, це не робить його хорошим рішенням.
Pedro.The.Kid

4
@Mark - jslatts рішення є правильним, і ніколи він не працюватиме в IE11, і лише тому, що він працює в поточних браузерах, це дуже погана практика, оскільки ви використовуєте побічний ефект як функціональність, і якщо впровадження змінить побічний ефект, БУДЕ зупинятися робочий.
Pedro.The.Kid

350

Мені подобається використовувати Url.Action () та Url.Content () так:

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

Строго кажучи, Url.Content потрібен лише для проходження маршруту, насправді не є частиною відповіді на ваше запитання.

Завдяки @BrianLegg за вказівку, що для цього слід використовувати новий синтаксис подання Razor. Приклад оновлено відповідно.


Якщо ви хочете допомогти
Tobias

6
Це прекрасно працює. Зауважте лише, що в MVC5 синтаксис змінився і має бути <a href='@Url.Action("MyAction", "MyController")'> та <img src = '@ Url.Content ("~ / Зміст / Зображення / MyLinkImage.png ")" />. Дякую
BrianLegg

він створив його з текстом NAN? що робити
Basheer AL-MOMANI

94

Позичивши відповідь Патріка, я виявив, що мені це потрібно зробити:

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

щоб не викликати метод публікації форми.


51

Зателефонуйте мені спрощено, але я просто роблю:

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

А ви просто подбаєте про висвітлення гіперпосилання. Нашим користувачам це подобається :)


1
@ Із однієї причини у цього не багато голосів - на нього відповіли набагато пізніше, ніж на інші відповіді. Я збирався проголосувати за це, але перевірив те, що сказав @ Slider345, і я можу підтвердити, що це не працює так, як хочеться в IE 7 або 8. У будь-якому випадку, якщо ви вирішите його використовувати, не забудьте встановити css посилання (навести курсор та активно), щоб text-decoration:noneпозбутися цього дурного підкреслення. Це необхідно для деяких браузерів (Firefox 11.0 точно).
Йетті

23
Але ви не повинні вкладати кнопки всередині елементів, навпаки. Принаймні, це не дійсний спосіб зробити це в HTML 5
Патрік Мегі

1
Так, це не працює навіть у IE10 з причин, що пояснює Патрік.
Ciaran Gallagher

Не вкладаються кнопки всередині елемента дії. stackoverflow.com/questions/6393827/…
Папа Бургундія

18

Використовуючи завантажувальний інструмент, це найкоротший і найпростіший підхід для створення посилання на дію контролера, який відображається як динамічна кнопка:

<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" })

Я повинен погодитися з чистотою. 100.
Кріс Катіньяні

15

Просто просто:

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

це все ще викликає метод публікації для мене, будь-яка ідея чому?
DevDave

Це недійсний синтаксис. IE10 кидає критичну помилку JavaScript з цим рядком, "SCRIPT5017: Помилка синтаксису в регулярному вираженні".
Ciaran Gallagher

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

15

Пізня відповідь, але саме так я перетворюю кнопку 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

зображення, демонструючи кнопку з завантажувальним пристроєм

На мою думку:

@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>

}

Сподіваюся, що це комусь допоможе


1
Працює круто! приємно і просто, htmlAttribute new { @class="btn btn-primary" })+ one
Irf

15

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

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

type = "кнопка" виконує вашу дію замість надсилання форми.


12

Ви не можете цього зробити Html.ActionLink. Ви повинні використовувати Url.RouteUrlта використовувати URL для побудови потрібного елемента.


Привіт, вибачте, я дуже новачок у MVC. Як би я використовував Url.RouteURL для досягнення образу?
uriDium

Що я мав на увазі, що ви не можете створити вкладений тег img (або тег кнопок) за допомогою простого виклику в ActionLink. Звичайно, CSS, що створює тег, сам по собі є способом його обійти, але тим не менш, ви не можете отримати тег img.
Мехрдад Афшарі

9

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


Це працювало для мене на IE10. Це хороше рішення, якщо ви просто хочете використовувати кнопку, а не зображення, хоча використання вбудованого JavaScript для простого посилання, ймовірно, не є ідеальним.
Ciaran Gallagher

1
(і просто для переконання, я тестував його на Opera, Safari, Chrome і Firefox, і це спрацювало)
Ciaran Gallagher

9

Простий спосіб зробити ваш Html.ActionLink в кнопку (поки у вас підключений BootStrap - який ви, мабуть, є) такий:

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

8

Ще пізніша відповідь, але я просто зіткнувся з подібною проблемою і закінчив написання власного розширення Image Image HtmlHelper .

Ви можете знайти її реалізацію в моєму блозі за посиланням вище.

Просто додається на випадок, якщо хтось знижує реалізацію.


3
Зараз посилання видається неактивним
d219

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

Відображення піктограми із посиланням


4

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

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


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
                    )


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?');" />
    }

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();
 }

Можливо, це болить поперек щоразу, коли ви додаєте посилання, яке має бути схожим на кнопку, але це досягає бажаного результату.


1

використовувати ФОРМУВАННЯ

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


0

Те, що я це зробив, полягає в тому, щоб діяти посилання і зображення окремо. Встановіть зображення посилання на дію як приховане, а потім додайте виклик тригера jQuery. Це більше рішення.

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

Приклад тригера:

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

0

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


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>
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.