web-dev-qa-db-ja.com

asp.net mvc Html.ActionLink()不要なルート値を保持する

私のビューには次のActionLinkがあります

<%= Html.ActionLink("LinkText", "Action", "Controller"); %>

そして、次のURLを作成します http://mywebsite.com/Controller/Action

次のように最後にIDを追加するとします。 http://mywebsite.com/Controller/Action/5 で、ページに移動します。このページには、上で指定したマークアップがあります。これで、URLを見ると次のようになっています。

http://mywebsite.com/Controller/Action/5 (IDの追加に注意してください)

しかし、私はそれをIDを削除し、このように元のように見えるようにしたい http://mywebsite.com/Controller/Action (ここにIDがないことに注意)

これを修正する方法はありますか?コントローラ/アクションが変更される可能性があるため、ハードコードされたURLを使用したくありません。

45
codette

解決策は、独自のルート値を指定することです(下の3番目のパラメーター)。

<%= Html.ActionLink("LinkText", "Action", "Controller", 
    new { id=string.Empty }, null) %>
47
codette

2番目の「アクションのみ」ルートを登録し、Html.RouteLink()を使用する必要があるようです。最初に、アプリケーションの起動時に次のようなルートを登録します。

routes.MapRoute("ActionOnly", "{controller}/{action}", 
   new { controller = "Home", action = "Index" } );

次に、これらのリンクを作成するためのActionLinkの代わりに、以下を使用します。

Html.RouteLink("About","ActionOnly")
13
Brian Cauthon

問題は、組み込まれているメソッドが、現在使用しているURLと入力したものから入力を受け取ることです。あなたはこれを試すことができます:

<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %>

それは手動でidパラメータをワイプする必要があります。

10
Garry Shutler

アクション名を明示的に「Action /」に設定しました。ハックに少し似ているようですが、すぐに修正できます。

@Html.ActionLink("Link Name", "Action/", "Controller")
4
BorgRebel

理由はわかりませんが、私にはうまくいきませんでした(おそらくMvc2 RCが原因です)。作成されたurlhelperメソッド=>

 public static string
            WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues)
        {
            var rv = helper.RequestContext.RouteData.Values;
            var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList();
            foreach (var ignoredValue in ignoredValues)
                rv.Remove(ignoredValue.Key);
            var res = helper.Action(action);
            foreach (var ignoredValue in ignoredValues)
                rv.Add(ignoredValue.Key, ignoredValue.Value);
            return res;
        }
4
Arnis Lapsa

明示的にオーバーライドする必要がある値がわからない場合、またはパラメーターの追加リストを避けたい場合は、以下のような拡張メソッドを使用できます。

<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a>

実装の詳細は このブログ投稿 です。

4
Steve Greatrex

別の方法は、ActionLink(HtmlHelper、String、String、RouteValueDictionary)オーバーロードを使用することであり、最後のパラメーターにnullを入れる必要はありません。

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>
2
Murilo Lima

Html.ActionLinkのオーバーロードは、MVCの新しいバージョンで変更されています。 MVC 5以降。これを行う方法は次のとおりです。

@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)

注:idパラメーターには ""を、HTMLATTRIBUTESにはnullを渡しました。

1
yogihosting

メニューのリンクを動的にする必要がありました。単一のページごとに多くの追加のコードとルーティングを実装するのではなく、HTMLヘルパーを省略しました。

<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>
0
nuander