私のビューには次の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を使用したくありません。
解決策は、独自のルート値を指定することです(下の3番目のパラメーター)。
<%= Html.ActionLink("LinkText", "Action", "Controller",
new { id=string.Empty }, null) %>
2番目の「アクションのみ」ルートを登録し、Html.RouteLink()を使用する必要があるようです。最初に、アプリケーションの起動時に次のようなルートを登録します。
routes.MapRoute("ActionOnly", "{controller}/{action}",
new { controller = "Home", action = "Index" } );
次に、これらのリンクを作成するためのActionLinkの代わりに、以下を使用します。
Html.RouteLink("About","ActionOnly")
問題は、組み込まれているメソッドが、現在使用しているURLと入力したものから入力を受け取ることです。あなたはこれを試すことができます:
<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %>
それは手動でidパラメータをワイプする必要があります。
アクション名を明示的に「Action /」に設定しました。ハックに少し似ているようですが、すぐに修正できます。
@Html.ActionLink("Link Name", "Action/", "Controller")
理由はわかりませんが、私にはうまくいきませんでした(おそらく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;
}
明示的にオーバーライドする必要がある値がわからない場合、またはパラメーターの追加リストを避けたい場合は、以下のような拡張メソッドを使用できます。
<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a>
実装の詳細は このブログ投稿 です。
別の方法は、ActionLink(HtmlHelper、String、String、RouteValueDictionary)オーバーロードを使用することであり、最後のパラメーターにnullを入れる必要はありません。
<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>
Html.ActionLinkのオーバーロードは、MVCの新しいバージョンで変更されています。 MVC 5以降。これを行う方法は次のとおりです。
@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)
注:idパラメーターには ""を、HTMLATTRIBUTESにはnullを渡しました。
メニューのリンクを動的にする必要がありました。単一のページごとに多くの追加のコードとルーティングを実装するのではなく、HTMLヘルパーを省略しました。
<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>