Html.ActionLink dưới dạng nút hoặc hình ảnh, không phải là liên kết


326

Trong bản phát hành mới nhất (RC1) của ASP.NET MVC, làm cách nào để có được Html.ActionLink để hiển thị dưới dạng nút hoặc hình ảnh thay vì liên kết?


13
Với MVC 3.0, bạn có thể thử theo cách này <a href="@Url.Action("Index","Home")"> <img src = "@ Url.Content (" ~ / Themes / Gold / hình ảnh / try-onit .png ")" alt = "Trang chủ" /> </a> Thông tin thêm, Hãy thử mycodingerrors.blogspot.com/2012/08/iêu
lasantha

Chỉ cần dành vài giờ để làm điều này "đúng" (ví dụ bằng cách mở rộng AjaxHelperbằng một ActionButton) tôi nghĩ tôi sẽ chia sẻ nó bên dưới.
Mã hóa

5
Thật buồn cười với tôi rằng bảy năm sau, câu hỏi này vẫn đang được đưa ra. Rõ ràng trong năm 2016 vẫn không có cách đơn giản, trực quan để làm điều này.
Ryan Lundy

Câu trả lời:


330

Phản hồi muộn nhưng bạn chỉ có thể giữ nó đơn giản và áp dụng một lớp CSS cho đối tượng htmlAttribut.

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

và sau đó tạo một lớp trong biểu định kiểu của bạn

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
Điều này hoạt động hoàn hảo với tôi, mặc dù bạn có thể cần thay thế null bằng một đối tượng routeValues ​​tùy thuộc vào nơi bạn đang liên kết đến.
David Conlisk

1
Làm thế nào để bạn xử lý chuỗi tên Nút bạn gán trong tham số liên kết hành động sau đó. Điều này đã không làm việc cho tôi.
ZVenue

1
Vấn đề tương tự, đối với tôi cũng vậy, linkText param không thể là null hoặc chuỗi rỗng tuy nhiên tôi đang tìm kiếm một nút thay thế hình ảnh.
Ant Swift

5
Điều đó thật tệ trong tất cả các cách, nó không hoạt động trong tất cả các trình duyệt và bạn đang sử dụng một tác dụng phụ làm chức năng. phù thủy làm cho nó một thực hành rất xấu không sử dụng nó. Chỉ vì nó hoạt động mà nó không làm cho nó một giải pháp tốt.
Pedro ..Kid

4
@Mark - Giải pháp jslatts là giải pháp chính xác và không có giải pháp nào trong IE11 và chỉ vì nó hoạt động trong các trình duyệt hiện tại, đó là một thực tế rất xấu khi bạn sử dụng một hiệu ứng phụ như chức năng và nếu việc triển khai thay đổi thì tác dụng phụ sẽ dừng lại đang làm việc.
Pedro ..Kid

350

Tôi thích sử dụng Url.Action () và Url.Content () như thế này:

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

Nói đúng ra, Url.Content chỉ cần thiết cho đường dẫn không thực sự là một phần của câu trả lời cho câu hỏi của bạn.

Cảm ơn @BrianLegg đã chỉ ra rằng điều này sẽ sử dụng cú pháp chế độ xem Dao cạo mới. Ví dụ đã được cập nhật tương ứng.


Nếu bạn muốn một người trợ giúp html cho điều đó: fsmpi.uni-bayreuth.de/~dun3/archives/ Kẻ
Tobias Hertkorn

6
Điều này hoạt động hoàn hảo. Chỉ cần lưu ý rằng trong MVC5, cú pháp đã thay đổi và phải là <a href='@Url.Action("MyAction", "MyControll")'> và <img src = '@ Url.Content ("~ / Content / Images / MyLinkImage.png ") '/>. Cảm ơn
BrianLegg

nó sản xuất nó với văn bản NAN?
Phải

94

Mượn từ câu trả lời của Patrick, tôi thấy rằng tôi phải làm điều này:

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

để tránh gọi phương thức bài của mẫu.


51

Gọi tôi đơn giản, nhưng tôi chỉ làm:

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

Và bạn chỉ cần chăm sóc các liên kết nổi bật. Người dùng của chúng tôi thích nó :)


1
@Ben một lý do điều này không có nhiều phiếu bầu là nó đã được trả lời muộn hơn nhiều so với các câu trả lời khác. Tôi đã định bỏ phiếu nhưng đã kiểm tra những gì @ Slider345 nói và có thể xác nhận điều này không hoạt động như mong muốn trong IE 7 hoặc 8. Trong mọi trường hợp, nếu bạn chọn sử dụng nó, đừng quên đặt css của liên kết (di chuột và hoạt động) để text-decoration:nonethoát khỏi gạch chân ngu ngốc đó. Điều này là cần thiết cho một số trình duyệt (chắc chắn Firefox 11.0).
Yetti

23
Nhưng bạn không được phép lồng các nút bên trong một yếu tố, ngược lại. Ít nhất đó không phải là cách làm hợp lệ trong HTML 5
Patrick Magee

1
Đúng, điều này không hoạt động trong IE10, vì những lý do Patrick giải thích.
Ciaran Gallagher

Không lồng các nút bên trong của phần tử hành động. stackoverflow.com/questions/6393827/
Burg Burgundy

18

Sử dụng bootstrap đây là cách tiếp cận ngắn nhất và sạch nhất để tạo liên kết đến hành động của bộ điều khiển xuất hiện dưới dạng nút động:

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

Hoặc để sử dụng trình trợ giúp Html:

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

Tôi phải đồng ý với sự sạch sẽ. 100.
Chris Catignani

15

Chỉ đơn giản vậy thôi :

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

Điều này vẫn viện dẫn phương pháp bài viết của quan điểm cho tôi, bất kỳ ý tưởng tại sao?
DevDave

Đây không phải là cú pháp hợp lệ. IE10 đưa ra một lỗi nghiêm trọng JavaScript với dòng này, "SCRIPT5017: Lỗi cú pháp trong biểu thức chính quy".
Ciaran Gallagher

Câu trả lời tốt, nhưng không có onclicknội dung xung quanh với location.href(vì vậy onclick="location.href='@Url.Action(....)'") tôi không thể làm cho nó hoạt động.
SharpC

15

Một câu trả lời muộn nhưng đây là cách tôi biến ActionLink của mình thành một nút. Chúng tôi đang sử dụng Bootstrap trong dự án của chúng tôi vì nó thuận tiện. Đừng bận tâm đến @T vì nó chỉ là một dịch giả chúng tôi đang sử dụng.

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

Ở trên cung cấp một liên kết như thế này và nó trông giống như hình dưới đây:

localhost:XXXXX/Firms/AddAffiliation/F0500

nút trình diễn hình ảnh với bootstrap

Theo quan điểm của tôi:

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

}

Hy vọng điều này sẽ giúp ai đó


1
Hoạt động tuyệt vời! hay và đơn giản, htmlAttribution new { @class="btn btn-primary" })+ one
Irf

15

nếu bạn không muốn sử dụng một liên kết, sử dụng nút. bạn cũng có thể thêm hình ảnh vào nút:

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

gõ = "nút" thực hiện hành động của bạn thay vì gửi biểu mẫu.


12

Bạn không thể làm điều này với Html.ActionLink. Bạn nên sử dụng Url.RouteUrlvà sử dụng URL để xây dựng thành phần bạn muốn.


Xin chào, xin lỗi tôi rất mới với MVC. Làm cách nào để sử dụng Url.RouteURL để đạt được hình ảnh?
uriDium

Ý tôi là bạn không thể tạo thẻ img lồng nhau (hoặc thẻ nút) bằng một cuộc gọi đơn giản đến ActionLink. Tất nhiên, CSS tự tạo kiểu cho thẻ là một cách để khắc phục nó, nhưng dù sao bạn cũng không thể có được thẻ img.
Mehrdad Afshari

9

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


Điều này làm việc cho tôi trên IE10. Đây là một giải pháp tốt nếu bạn chỉ đơn giản muốn sử dụng một nút thay vì hình ảnh, mặc dù việc phải sử dụng JavaScript nội tuyến cho một liên kết đơn giản có lẽ không lý tưởng.
Ciaran Gallagher

1
(và để chắc chắn, tôi đã thử nghiệm nó trên Opera, Safari, Chrome và Firefox và nó đã hoạt động)
Ciaran Gallagher

9

Một cách đơn giản để biến Html.ActionLink của bạn thành một nút (miễn là bạn đã cắm BootStrap - thứ mà bạn có thể có) là như thế này:

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

8

Ngay cả phản hồi sau đó, nhưng tôi chỉ gặp phải một vấn đề tương tự và cuối cùng đã viết phần mở rộng liên kết hình ảnh HtmlHelper của riêng tôi .

Bạn có thể tìm thấy một triển khai của nó trên blog của tôi trong liên kết ở trên.

Chỉ cần thêm vào trong trường hợp ai đó đang săn lùng một thực hiện.


3
Liên kết dường như không hoạt động ngay bây giờ
d219

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

Để hiển thị một biểu tượng với liên kết


4

Làm những gì Mehrdad nói - hoặc sử dụng trình trợ giúp url từ HtmlHelperphương thức tiện ích mở rộng như Stephen Walther mô tả ở đây và tạo phương thức tiện ích mở rộng của riêng bạn có thể được sử dụng để hiển thị tất cả các liên kết của bạn.

Sau đó, sẽ dễ dàng hiển thị tất cả các liên kết dưới dạng nút / neo hoặc bất cứ điều gì bạn thích - và quan trọng nhất là bạn có thể thay đổi suy nghĩ của mình sau khi bạn phát hiện ra rằng bạn thực sự thích một số cách khác để tạo liên kết của mình.


3

bạn có thể tạo phương thức mở rộng của riêng mình
hãy xem triển khai của tôi

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

sau đó sử dụng nó trong chế độ xem của bạn hãy xem cuộc gọi của tôi

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

2

Đối với Thiết kế Vật liệu Lite và MVC:

<a class="mdl-navigation__link" href='@Url.Action("MyAction", "MyController")'>Link Name</a>

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

Dường như có rất nhiều giải pháp về cách tạo một liên kết hiển thị dưới dạng hình ảnh, nhưng không có giải pháp nào làm cho nó có vẻ là một nút.

Chỉ có cách tốt mà tôi đã tìm thấy để làm điều này. Đó là một chút hacky, nhưng nó hoạt động.

Những gì bạn phải làm là tạo một nút và một liên kết hành động riêng biệt. Làm cho liên kết hành động vô hình bằng cách sử dụng css. Khi bạn nhấp vào nút, nó có thể kích hoạt sự kiện nhấp của liên kết hành động.

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

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

Nó có thể là một nỗi đau ở mông để làm điều này mỗi khi bạn thêm một liên kết cần trông giống như một nút, nhưng nó thực hiện được kết quả mong muốn.


1

sử dụng HÌNH THỨC

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


0

Cách tôi đã làm là để có ActionLink và hình ảnh riêng biệt. Đặt hình ảnh hành động là ẩn và sau đó thêm một cuộc gọi kích hoạt jQuery. Đây là một cách giải quyết.

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

Ví dụ kích hoạt:

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

0

Url.Action()sẽ giúp bạn có được URL trống cho hầu hết các trường hợp quá tải Html.ActionLink, nhưng tôi nghĩ rằng URL-from-lambdachức năng này chỉ khả dụng Html.ActionLinkcho đến nay. Hy vọng rằng họ sẽ thêm một quá tải tương tự Url.Actiontại một số điểm.


0

Đây là cách tôi đã làm mà không cần kịch bản:

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

Tương tự, nhưng với hộp thoại tham số và xác nhận:

@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>
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.