リンクではなくボタンまたは画像としてのHtml.ActionLink


326

ASP.NET MVCの最新(RC1)リリースで、Html.ActionLinkをリンクではなくボタンまたは画像としてレンダリングするにはどうすればよいですか?


13
MVC 3.0では、この方法を試すことができます<a href="@Url.Action("Index","Home")"> <img src = "@ Url.Content("〜/ Themes / Gold / images / try-onit 、この試してみてください")" ALT = "ホーム" /> </a>の詳細情報を.pngのmycodingerrors.blogspot.com/2012/08/...を
lasantha

これを「適切に」実行するために数時間費やしただけで(たとえば、で拡張AjaxHelperすることでActionButton)、以下で共有すると思いました。
コーディング終了2014年

5
7年が経過した今でも、この質問が賛成票を集めていることは、私にとって陽気です。どうやら2016年には、これを行う簡単で直感的な方法はまだありません。
Ryan Lundy 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オブジェクトに置き換える必要がある場合があります。
David Conlisk

1
次に、アクションリンクパラメータで割り当てるボタン名文字列をどのように処理しますか。これは私にはうまくいきませんでした。
Z会場

1
同じ問題、私にとっても、linkTextパラメータをnullまたは空の文字列にすることはできませんが、画像ボタンの置き換えを探しています。
Ant Swift

5
それはあらゆる面で悪いことであり、すべてのブラウザで機能するわけではなく、機能として副作用を使用しています。魔女はそれを使用しないで非常に悪い習慣になります。それが機能するからといって、それが良い解決策になるわけではありません。
Pedro.The.Kid 2014年

4
@Mark-jslattsソリューションは正しいものであり、IE11では機能しません。現在のブラウザーで機能しているからといって、機能として副作用を使用しているため、実装が副作用を変更する場合、副作用は停止します。ワーキング。
Pedro.The.Kid 2014年

350

私はUrl.Action()とUrl.Content()を次のように使用するのが好きです:

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

厳密に言うと、Url.Contentはパスにのみ必要であり、質問への回答の一部ではありません。

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


:あなたはそのためAのHTMLヘルパーをしたい場合fsmpi.uni-bayreuth.de/~dun3/archives/...
トビアスHertkorn

6
これは完全に機能します。MVC5では構文が変更され、<a href='@Url.Action("MyAction", "MyController")'>および<img src = '@ Url.Content( "〜/ Content / Images / MyLinkImage.png ") '/>。ありがとう
BrianLegg

それはNANテキストでそれを生成しましたか?何をするか
Basheer AL-MOMANI 2016

94

パトリックの答えを借りて、私はこれをしなければならないことに気づきました:

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

フォームのpostメソッドを呼び出さないようにするため。


51

単純化して呼んでください、しかし私はただします:

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

ハイパーリンクのハイライトを処理するだけです。私たちのユーザーはそれを愛しています:)


1
@Benの投票数が少ない理由の1つは、他の回答よりもかなり遅く回答されたことです。私は投票しようとしていましたが、@ Slider345の発言をテストしてみたところ、これがIE 7または8で期待どおりに機能しないことを確認できました。いずれにしても、使用することを選択した場合は、CSSを設定することを忘れないでくださいtext-decoration:noneその愚かな下線を取り除くためのリンク(ホバーとアクティブ)。一部のブラウザではこれが必要です(Firefox 11.0は確実です)。
Yetti、2012

23
ただし、要素内にボタンをネストすることはできません。逆も同様です。少なくとも、HTML 5で有効な方法ではありません
Patrick Magee、

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>

これはまだビューのpostメソッドを呼び出しますが、なぜですか?
DevDave 2012

これは有効な構文ではありません。IE10は、「SCRIPT5017:正規表現の構文エラー」という行でJavaScriptクリティカルエラーをスローします。
Ciaran Gallagher

良い答えですが、onclickコンテンツをlocation.href(so onclick="location.href='@Url.Action(....)'")で囲まないと、動作しませんでした。
SharpC、2015年

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.ActionLinkUrl.RouteUrlURLを使用して、必要な要素を作成する必要があります。


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

つまり、ActionLinkを呼び出すだけでは、ネストされたimgタグ(またはボタンタグ)を生成できないということです。もちろん、CSSでタグ自体をスタイル設定することはそれを回避する方法ですが、それでもimgタグを取得することはできません。
Mehrdad Afshari

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

さらに後の応答ですが、同様の問題に遭遇し、独自の画像リンクHtmlHelper拡張機能を作成してしまいました

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

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


3
リンクは現在非アクティブになっているようです
d219

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

リンク付きのアイコンを表示するには


4

Mehrdadの言うことを行う-または、HtmlHelperStephen Waltherがここで説明するような拡張メソッドからのURLヘルパーを使用するで使用して、すべてのリンクのレンダリングに使用できる独自の拡張メソッドを作成します。

そうすれば、すべてのリンクをボタン/アンカーとして、または好きなようにレンダリングするのが簡単になります。最も重要なのは、リンクを作成する他の方法を実際に好むとわかったときに、後で気が変わることです。


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
                    )

2

Material Design Liteおよび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

画像として表示されるリンクを作成する方法については多くの解決策があるようですが、ボタンのように見えるものはありません。

私がこれを行うには、良い方法しかありません。少しハックですが、動作します。

ボタンと別のアクションリンクを作成する必要があります。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

FORMACTIONを使用する

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


0

私が行った方法は、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.