asp.net MVC Html.ActionLink()私はしたくないルート値を保ちます
-
13-09-2019 - |
質問
私は私の見解では、次のActionLinkのを持っている。
<%= Html.ActionLink("LinkText", "Action", "Controller"); %>
と、それは次のURL http://mywebsite.com/Controller/Actionする
私はそうのように末尾にIDを追加すると言う: http://mywebsite.com/Controller/Action / 53 とページに移動します。このページでは私は私が上で指定したマークアップを持っています。私はURLを見たときに今、それはこのようになります作成します:
http://mywebsite.com/Controller/Action/53 を(添加に気付きますID)
しかし、私はそれがIDを削除し、それがもともとやったように見える、この http://mywebsite.com /コントローラ/アクションに(ここにはIDに気付かない)
私はこの問題を解決することができますどのように任意のアイデア?私は私のコントローラ/アクションが変更される可能性があるため、ハードコードされたURLを使用する必要はありません。
解決
ソリューションは、独自のルート値を指定することである(以下第三パラメータ)
<%= Html.ActionLink("LinkText", "Action", "Controller",
new { id=string.Empty }, null) %>
他のヒント
これが鳴ります。最初に起動し、あなたのアプリケーションでは、このようなルートを登録します:
routes.MapRoute("ActionOnly", "{controller}/{action}",
new { controller = "Home", action = "Index" } );
そして、代わりにActionLinkののリンクを使用したものを作成します:
Html.RouteLink("About","ActionOnly")
問題は方法で構築されたURLからの入力を取るあなたが現在オンになっているだけでなく、あなたが提供するもの。あなたはこれを試すことができます:
<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %>
手動idパラメータを拭く必要があること。
は、なぜ分からないのですが、それは私のために動作しませんでした。方法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>
実装の詳細は、
にこのブログの記事でです私は明示的に「アクション/」としてアクション名を設定します。少しハックのように思えるが、それは簡単な修正です。
@Html.ActionLink("Link Name", "Action/", "Controller")
もう一つの方法は、ActionLinkの(HtmlHelperの、文字列、文字列、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)
私はHTMLATTRIBUTESのidパラメータとヌルのために「」渡されます。
私は動的にする私のメニューリンクを必要としていました。ではなくHTMLヘルパーを省くすべての単一ページIのシンプルための余分なコードとルーティングの多くを実装します。
<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>