2009-02-27 67 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

7年後、この質問はまだアップボートを取得していることは私に陽気です。明らかに2016年にこれを行うための単純で直感的な方法はまだありません。 –

答えて

310

遅れても応答は簡単ですが、htmlAttributesオブジェクトにCSSクラスを適用するだけで済みます。

<%= 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 –

+1

アクションリンクパラメータで割り当てたボタン名文字列をどのように処理しますか?これは私にとってはうまくいかなかった。 – ZVenue

12

Html.ActionLinkでこれを行うことはできません。 Url.RouteUrlを使用し、URLを使用して必要な要素を作成する必要があります。

+0

こんにちは、申し訳ありませんが、私はMVCを非常に新しくしています。 Url.RouteURLを使用して画像を取得するにはどうすればよいですか? – uriDium

+0

私が言ったのは、ActionLinkへの簡単な呼び出しで入れ子になったimgタグ(またはボタンタグ)を生成できないということです。もちろん、タグ自体をスタイリングするCSSはそれを回避する方法ですが、imgタグを取得することはできません。 –

4

Mehrdadの言う通り、またはHtmlHelperのような拡張メソッドのURLヘルパーを使用して、hereと記載し、すべてのリンクのレンダリングに使用できる独自の拡張メソッドを作成します。

それから、すべてのリンクをボタン/アンカーまたは好みのものとして簡単にレンダリングすることができます。また、実際にリンクを作成する方法が実際には好きであることがわかったときには、

8

でも、後で応じてクラスを作成しますが、私はちょうど同様の問題に遭遇したとImage link HtmlHelper extension自分自身を書いてしまいました。

私のブログでは、上のリンクでその実装を見つけることができます。

誰かが実装を捜している場合に備えて追加されました。

+1

はクールに見えますが、その 'LinkBuilder'リファレンスは何ですか? –

+0

リンクはもう働きません。 – dvallejo

+0

リンクが現在非アクティブになっている – d219

325

私はこのようなUrl.Action()とUrl.Content()を使用したい:厳密Url.Contentのみパス化のために必要とされ、話す

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

が本当にあなたの答えの一部ではありません質問。

新しいRazorビューの構文を使用する必要があることを指摘してくれた@BrianLeggに感謝します。例はそれに応じて更新されました。

+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()はあなたのHtml.ActionLinkのほとんどのオーバーロードのために裸のURLを取得しますが、私はURL-from-lambda機能は、これまでHtml.ActionLinkを通じてのみ利用可能だと思います。うまくいけば、彼らはある時点でUrl.Actionに同様のオーバーロードを追加します。

49

は、単純な私を呼び出して、私はちょうど行います

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

そして、あなただけのハイパーリンクのハイライトの世話をします。私たちのユーザーはそれが大好きです:)

+1

私のために働かなかった。すなわち、それはちょうどフォームを提出しました。 – Slider345

+1

@Benこれは多くの票を持っていない1つの理由は、それは他の答えよりもずっと後に答えられたということです。私はそれを投票しようとしていたが、@ Slider345が言ったことをテストし、IE 7または8でこれがうまくいかないことを確認できる。いずれにしても、あなたがそれを使うことを選択した場合、その愚かな下線を取り除くためにリンク(ホバーとアクティブ)を 'text-decoration:none 'に置き換えます。これは、一部のブラウザ(Firefox 11.0の場合)に必要です。 – Yetti

+22

しかし、要素の中にボタンを入れ子にすることはできません。その逆もあります。少なくともHTML5でそれを行う有効な方法ではありません。 –

0

ちょうど見つけたthis extension - それは簡単で効果的です。

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のと別々にイメージを持っていることです。 アクションリンクイメージを非表示に設定して とし、jQueryトリガーコールを追加しました。これは回避策です。

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

トリガ例:パトリックの答えから

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

借入は、私はこれを行うために持っていたことが分かった:

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

は、フォームのPOSTメソッドを呼び出さないようにします。

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をボタンにする方法です。ブートストラップを使っているので便利です。私たちが使用している唯一の翻訳者から@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

あなたはこれが最短とされ、ブートストラップの使用私のコール

@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

を見て取り、あなたのビューでそれを使用

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

私の実装では、独自の拡張メソッド
テイク外観を作成することができますダイナミックボタンとして表示されるコントローラーアクションへのリンクを作成する最もクリーンな方法:

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

またはHTMLヘルパーを使用する:(限り、あなたはブートストラップに差し込まれているよう - あなたはおそらく持っている)ボタンにあなたのHtml.ActionLinkを作る行うに

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

簡単な方法は、このようなものです:

@Html.ActionLink("Button text", "ActionName", "ControllerName", new { @class = "btn btn-primary" }) 
関連する問題