Html.ActionLink sebagai tombol atau gambar, bukan tautan

326

Dalam rilis terbaru (RC1) dari ASP.NET MVC, bagaimana cara mendapatkan Html.ActionLink untuk dirender sebagai tombol atau gambar alih-alih tautan?

Ryan Lundy
sumber
13
Dengan MVC 3.0 Anda dapat mencoba cara ini <a href="@Url.Action("Index","Home")"> <img src = "@ Url.Content (" ~ / Tema / Emas / gambar / try-onit) .png ")" alt = "Home" /> </a> Info selengkapnya, Coba ini mycodingerrors.blogspot.com/2012/08/…
lasantha
Setelah menghabiskan beberapa jam melakukan ini dengan "benar" (misalnya dengan memperluas AjaxHelperdengan ActionButton) saya pikir saya akan membagikannya di bawah ini.
Hilang Coding
5
Sangat lucu bagi saya bahwa tujuh tahun kemudian, pertanyaan ini masih mendapatkan peningkatan. Tampaknya pada tahun 2016 masih belum ada cara yang sederhana dan intuitif untuk melakukan ini.
Ryan Lundy

Jawaban:

330

Respons terlambat tetapi Anda bisa membuatnya tetap sederhana dan menerapkan kelas CSS ke objek htmlAttributes.

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

dan kemudian buat kelas di stylesheet Anda

a.classname
{
    background: url(../Images/image.gif) no-repeat top left;
     display: block;
     width: 150px;
     height: 150px;
     text-indent: -9999px; /* hides the link text */
}
Menandai
sumber
2
Ini berfungsi dengan baik untuk saya, meskipun Anda mungkin perlu mengganti null dengan objek routeValues ​​tergantung di mana Anda terhubung.
David Conlisk
1
Bagaimana Anda menangani string Nama tombol yang Anda tetapkan di parameter tautan tindakan. Ini tidak berhasil untuk saya.
ZVenue
1
Masalah yang sama, bagi saya juga, param linkText tidak boleh nol atau dan string kosong namun saya sedang mencari penggantian tombol gambar.
Ant Swift
5
itu buruk dalam segala hal, itu tidak berfungsi di semua browser, dan Anda menggunakan efek samping sebagai fungsi. penyihir membuatnya menjadi praktik yang sangat buruk jangan menggunakannya. Hanya karena berfungsi, itu tidak menjadikannya solusi yang baik.
Pedro. Anak
4
@ Mark - solusi jslatts adalah yang benar dan tidak itu tidak akan berfungsi di IE11 dan hanya karena itu bekerja di browser saat ini adalah praktik yang sangat buruk karena Anda menggunakan efek samping sebagai fungsi dan jika implementasinya mengubah efek samping AKAN berhenti kerja.
Pedro.The.Kid
350

Saya suka menggunakan Url.Action () dan Url.Content () seperti ini:

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

Sebenarnya, Url.Content hanya diperlukan untuk pathing bukan bagian dari jawaban untuk pertanyaan Anda.

Terima kasih kepada @BrianLegg untuk menunjukkan bahwa ini harus menggunakan sintaks tampilan Razor baru. Contoh telah diperbarui.

jslatts
sumber
Jika Anda menginginkan penolong html untuk itu: fsmpi.uni-bayreuth.de/~dun3/archives/…
Tobias Hertkorn
6
Ini bekerja dengan sempurna. Harap perhatikan bahwa dalam MVC5 sintaks telah berubah dan seharusnya menjadi <a href='@Url.Action("MyAction", "MyController")'> dan <img src = '@ Url.Content ("~ / Content / Gambar / MyLinkImage.png ") '/>. Terima kasih
BrianLegg
diproduksi dengan teks NAN? apa yang harus dilakukan
Basheer AL-MOMANI
94

Meminjam dari jawaban Patrick, saya menemukan bahwa saya harus melakukan ini:

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

untuk menghindari memanggil metode posting form.

DevDave
sumber
51

Panggil saya dengan sederhana, tetapi saya hanya melakukannya:

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

Dan Anda hanya merawat sorotan hyperlink. Pengguna kami menyukainya :)

agAus
sumber
1
@Ben salah satu alasan mengapa ini tidak memiliki banyak suara adalah karena jawabannya dijawab lebih lambat dari jawaban lainnya. Saya akan memilihnya tetapi menguji apa yang dikatakan @ Slider345 dan dapat mengkonfirmasi ini tidak berfungsi seperti yang diinginkan di IE 7 atau 8. Dalam hal apa pun, jika Anda memilih untuk menggunakannya, jangan lupa untuk mengatur css dari tautan (arahkan dan aktif) untuk text-decoration:nonemenyingkirkan garis bawah bodoh itu. Ini diperlukan untuk beberapa browser (Firefox 11.0 pasti).
Yetti
23
Tapi Anda tidak seharusnya bersarang tombol di dalam elemen, sebaliknya visa. Setidaknya itu bukan cara yang valid untuk melakukannya dalam HTML 5
Patrick Magee
1
Yap, ini tidak berfungsi bahkan pada IE10, untuk alasan yang dijelaskan Patrick.
Ciaran Gallagher
Tidak ada sarang tombol di dalam elemen aksi. stackoverflow.com/questions/6393827/…
Papa Burgundy
18

Menggunakan bootstrap, ini adalah pendekatan terpendek dan terbersih untuk membuat tautan ke tindakan pengontrol yang muncul sebagai tombol dinamis:

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

Atau menggunakan bantuan Html:

@Html.ActionLink("Click Me", "Action", "Controller", new { @class = "btn btn-primary" })
Cameron Forward
sumber
Saya harus setuju dengan kebersihannya. 100.
Chris Catignani
15

Cukup sederhana:

<button onclick="@Url.Action("index", "Family", new {familyid = Model.FamilyID })">Cancel</button>
Patrick Kan
sumber
ini masih memanggil metode tampilan pos untuk saya, tahu mengapa?
DevDave
Ini bukan sintaks yang valid. IE10 melempar kesalahan kritis JavaScript dengan baris ini, "SCRIPT5017: Kesalahan sintaksis dalam ekspresi reguler".
Ciaran Gallagher
Jawaban yang bagus, tetapi tanpa mengelilingi onclickisinya dengan location.href(jadi onclick="location.href='@Url.Action(....)'") saya tidak bisa membuatnya berfungsi.
SharpC
15

Sebuah jawaban yang terlambat tetapi ini adalah bagaimana saya membuat ActionLink saya menjadi sebuah tombol. Kami menggunakan Bootstrap di proyek kami karena membuatnya nyaman. Sudahlah, @T karena satu-satunya penerjemah yang kami gunakan.

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

Di atas memberikan tautan seperti ini dan terlihat seperti gambar di bawah ini:

localhost:XXXXX/Firms/AddAffiliation/F0500

gambar mendemonstrasikan tombol dengan bootstrap

Menurut saya:

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

}

Semoga ini bisa membantu seseorang

Kaisar 2052
sumber
1
Bekerja dengan baik! bagus dan sederhana, the htmlAttribute new { @class="btn btn-primary" })+ one
Irf
15

jika Anda tidak ingin menggunakan tautan, gunakan tombol. Anda dapat menambahkan gambar ke tombol juga:

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

type = "button" melakukan tindakan Anda alih-alih mengirimkan formulir.

Amir Chatrbahr
sumber
12

Anda tidak dapat melakukan ini dengan Html.ActionLink. Anda harus menggunakan Url.RouteUrldan menggunakan URL untuk membangun elemen yang Anda inginkan.

Mehrdad Afshari
sumber
Hai, maaf saya sangat baru di MVC. Bagaimana saya menggunakan Url.RouteURL untuk mencapai gambar?
uriDium
Yang saya maksud adalah Anda tidak dapat membuat tag img bersarang (atau tag tombol) dengan panggilan sederhana ke ActionLink. Tentu saja, CSS menata tag itu sendiri adalah cara untuk mengelilinginya, tapi tetap saja Anda tidak bisa mendapatkan tag img.
Mehrdad Afshari
9

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

Jiri HWeb Horalek
sumber
Ini bekerja untuk saya di IE10. Ini adalah solusi yang baik jika Anda hanya ingin menggunakan tombol daripada gambar, meskipun harus menggunakan JavaScript inline untuk tautan sederhana mungkin tidak ideal.
Ciaran Gallagher
1
(dan hanya untuk memastikan, saya mengujinya di Opera, Safari, Chrome dan Firefox dan berhasil)
Ciaran Gallagher
9

Cara mudah untuk membuat Html.ActionLink Anda menjadi sebuah tombol (selama Anda memasang BootStrap - yang mungkin Anda miliki) adalah seperti ini:

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

Bahkan tanggapan kemudian, tetapi saya hanya mengalami masalah yang sama dan akhirnya menulis sendiri gambar saya HtmlHelper ekstensi .

Anda dapat menemukan penerapannya di blog saya di tautan di atas.

Baru ditambahkan jika seseorang memburu suatu implementasi.

Mirko
sumber
3
Tautan tampaknya tidak aktif sekarang
d219
5
<li><a href="@Url.Action(  "View", "Controller" )"><i class='fa fa-user'></i><span>Users View</span></a></li>

Untuk menampilkan ikon dengan tautan

Andrew Day
sumber
4

Lakukan apa yang dikatakan Mehrdad - atau gunakan penolong url dari HtmlHelpermetode ekstensi seperti dijelaskan Stephen Walther di sini dan buat metode ekstensi Anda sendiri yang dapat digunakan untuk merender semua tautan Anda.

Maka akan mudah untuk merender semua tautan sebagai tombol / jangkar atau mana pun yang Anda suka - dan, yang paling penting, Anda dapat berubah pikiran nanti ketika Anda mengetahui bahwa Anda sebenarnya lebih memilih cara lain untuk membuat tautan Anda.

mookid8000
sumber
3

Anda dapat membuat metode ekstensi sendiri,
lihat implementasi saya

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

kemudian gunakan dalam tampilan Anda lihat panggilan saya

 @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
                    )
Basheer AL-MOMANI
sumber
2

Untuk Material Design Lite dan MVC:

<a class="mdl-navigation__link" href='@Url.Action("MyAction", "MyController")'>Link Name</a>
Rody Davis
sumber
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?');" />
    }
pengguna477864
sumber
1

Tampaknya ada banyak solusi tentang cara membuat tautan yang ditampilkan sebagai gambar, tetapi tidak ada yang membuatnya tampak sebagai tombol.

Hanya ada cara bagus yang saya temukan untuk melakukan ini. Agak aneh, tapi berhasil.

Yang harus Anda lakukan adalah membuat tombol dan tautan tindakan terpisah. Buat tautan tindakan tidak terlihat menggunakan css. Ketika Anda mengklik tombol, itu bisa memunculkan event klik pada tautan tindakan.

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

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

Mungkin ada rasa sakit di pantat untuk melakukan ini setiap kali Anda menambahkan tautan yang perlu terlihat seperti tombol, tetapi itu mencapai hasil yang diinginkan.

bsayegh
sumber
1

gunakan FORMACTION

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

Baru saja menemukan ekstensi ini untuk melakukannya - sederhana dan efektif.

Shaul Behr
sumber
Tautan rusak.
Chris Catignani
0

Cara saya melakukannya adalah memiliki actionLink dan gambar secara terpisah. Atur gambar actionlink sebagai tersembunyi dan kemudian tambahkan panggilan pemicu jQuery. Ini lebih merupakan solusi.

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

Contoh pemicu:

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

Url.Action()akan memberi Anda URL telanjang untuk sebagian besar kelebihan Html.ActionLink, tapi saya pikir URL-from-lambdafungsionalitas hanya tersedia Html.ActionLinksejauh ini. Semoga mereka akan menambahkan kelebihan serupa Url.Actiondi beberapa titik.

Dhanasekar
sumber
0

Ini adalah bagaimana saya melakukannya tanpa skrip:

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

Sama, tetapi dengan dialog parameter dan konfirmasi:

@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>
}
Jevgenij Martynenko
sumber