Html.ActionLink เป็นปุ่มหรือรูปภาพไม่ใช่ลิงก์


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) ฉันคิดว่าฉันจะแบ่งปันด้านล่าง
Gone Coding

5
เป็นเรื่องตลกสำหรับฉันที่เจ็ดปีต่อมาคำถามนี้ยังคงมีผู้โหวตมากขึ้น เห็นได้ชัดว่าในปี 2559 ยังไม่มีวิธีที่ง่ายและใช้งานง่ายในการทำสิ่งนี้
Ryan Lundy

คำตอบ:


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 ​​ขึ้นอยู่กับว่าคุณกำลังลิงก์ไปที่ใด
David Conlisk

1
คุณจัดการสตริงชื่อปุ่มที่คุณกำหนดในพารามิเตอร์ลิงก์การดำเนินการได้อย่างไร สิ่งนี้ไม่ได้ผลสำหรับฉัน
ZVenue

1
ปัญหาเดียวกันสำหรับฉันเช่นกัน linkText param ไม่สามารถเป็นโมฆะและและสตริงว่างเปล่าได้ แต่ฉันกำลังมองหาการเปลี่ยนปุ่มรูปภาพ
Ant Swift

5
นั่นเป็นวิธีที่ไม่ดีในทุกประเภทมันไม่ได้ทำงานในเบราว์เซอร์ทุกประเภทและคุณใช้ผลข้างเคียงเป็นฟังก์ชันการทำงาน แม่มดทำให้การปฏิบัติที่เลวร้ายมากไม่ได้ใช้ เพียงเพราะมันใช้งานได้มันไม่ได้ทำให้มันเป็นทางออกที่ดี
Pedro.The.Kid

4
@ Mark - jslatts solution เป็นวิธีที่ถูกต้องและไม่สามารถใช้งานได้ใน 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 ที่ชี้ให้เห็นว่านี่ควรใช้ไวยากรณ์มุมมองมีดโกนใหม่ ตัวอย่างได้รับการปรับปรุงให้สอดคล้อง


หากคุณต้องการผู้ช่วย html สำหรับสิ่งนั้น: fsmpi.uni-bayreuth.de/~dun3/archives/…
Tobias Hertkorn

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 แน่นอน)
Yetti

23
แต่คุณไม่ควรที่จะซ่อนปุ่มไว้ในองค์ประกอบวีซ่าในทางกลับกัน อย่างน้อยมันก็เป็นวิธีที่ไม่ถูกต้องในการทำใน HTML 5
Patrick Magee

1
ใช่สิ่งนี้ไม่ทำงานแม้แต่ IE10 ด้วยเหตุผลที่แพทริคอธิบาย
Ciaran Gallagher

ไม่มีการซ้อนปุ่มภายในองค์ประกอบการดำเนินการ stackoverflow.com/questions/6393827/…
Papa Burgundy

18

การใช้ bootstrap นี่เป็นวิธีที่สั้นและสะอาดที่สุดในการสร้างลิงค์ไปยังแอคชั่นควบคุมที่ปรากฏเป็นปุ่มแบบไดนามิก:

<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.
Chris Catignani

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 = "button"ทำการกระทำของคุณแทนที่จะส่งแบบฟอร์ม


12

Html.ActionLinkคุณไม่สามารถทำเช่นนี้กับ คุณควรใช้Url.RouteUrlและใช้ URL เพื่อสร้างองค์ประกอบที่คุณต้องการ


สวัสดีขอโทษฉันยังใหม่กับ MVC ฉันจะใช้ Url.RouteURL เพื่อให้ได้ภาพได้อย่างไร
uriDium

สิ่งที่ฉันหมายถึงคือคุณไม่สามารถสร้างแท็ก img ที่ซ้อนกัน (หรือแท็กปุ่ม) ด้วยการเรียกใช้ ActionLink อย่างง่าย แน่นอน CSS จัดแต่งทรงผมของแท็กเองเป็นวิธีที่จะได้รับรอบ แต่อย่างไรก็ตามคุณไม่สามารถรับแท็ก img
Mehrdad Afshari

9

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


สิ่งนี้ใช้ได้กับฉันใน IE10 นี่เป็นวิธีแก้ปัญหาที่ดีถ้าคุณเพียงแค่ต้องการใช้ปุ่มแทนรูปภาพ แต่การใช้ inline 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

แม้กระทั่งการตอบสนองในภายหลัง แต่ฉันเพิ่งพบปัญหาที่คล้ายกันและลงเอยด้วยการเขียนลิงก์รูปภาพของฉันเองHtmlHelper ส่วนขยายนามสกุล

คุณสามารถค้นหาการนำไปใช้งานได้ในบล็อกของฉันในลิงก์ด้านบน

เพิ่งเพิ่มในกรณีที่มีใครบางคนกำลังตามล่าการติดตั้ง


3
ดูเหมือนว่าลิงก์จะไม่ทำงานในขณะนี้
d219


4

ทำในสิ่งที่ Mehrdad พูด - หรือใช้ผู้ช่วย url จากHtmlHelperวิธีการขยายอย่าง Stephen Walther อธิบายที่นี่และสร้างวิธีการขยายของคุณเองซึ่งสามารถใช้เพื่อแสดงลิงก์ทั้งหมดของคุณ

จากนั้นจะทำให้การแสดงผลลิงก์ทั้งหมดเป็นปุ่ม / แองเคอร์หรือสิ่งที่คุณต้องการ - และที่สำคัญที่สุดคือคุณสามารถเปลี่ยนใจได้ในภายหลังเมื่อคุณพบว่าคุณชอบวิธีอื่นในการสร้างลิงก์ของคุณ


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

อาจเป็นเรื่องเจ็บปวดในการทำเช่นนี้ทุกครั้งที่คุณเพิ่มลิงค์ที่จำเป็นต้องมีลักษณะเหมือนปุ่ม แต่จะได้ผลลัพธ์ที่ต้องการ




0

วิธีที่ฉันทำมันคือการมี actionLink และภาพแยกจากกัน ตั้งค่าอิมเมจ actionlink เป็นซ่อนแล้วเพิ่มการเรียกทริกเกอร์ 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>
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.