ASP.Net MVC Html.ActionLink()の問題
-
03-07-2019 - |
質問
MVCベータ版を使用して、ASP.Net MVCを理解する簡単なアプリケーションを作成しています。アプリケーションは、タグ付きのシンプルな写真/ビデオ共有サイトです。私はMVCスケルトンプロジェクトに取り組んでいます。ナビゲーションバーにHtml.ActionLink()をいくつか追加しましたが、1つの場所に追加したHtml.ActionLink()の1つに問題があります。
〜/ Tagsにデータベースのすべてのタグを表示させ、〜/ Tags / {tag}に{tag}でタグ付けされたすべてのファイルのリストを表示させたい。これは期待どおりに機能しますが、〜/ Tags / {tag}をたどると、ナビゲーションバーのHtml.ActionLink()が〜を指すのではなく〜/ Tags / {tag}リンクと同じになるように変更します。 /タグ。 〜/ Tags / {tag}をたどるとナビゲーションバーのActionLink()が変化する理由がわかりません。プロジェクト内の別のリンクに移動すると、ActionLink()は期待どおりに機能します。
このように設定されたアクションリンクとルートがあります。 My TagsControllerにはこのIndexアクションがあります。 int?ページング制御用です。 2つのビューがあり、1つはAllと呼ばれ、もう1つはDetailsと呼ばれます。私は何を間違えていますか?
Html.ActionLink("Tags", "Index", "Tags") // In navigation bar
routes.MapRoute(
"Tags",
"Tags/{tag}",
new
{
controller = "Tags", action = "Index", tag = "",
});
public ActionResult Index(string tag, int? id )
{ // short pseudocode
If (tag == "")
return View("All", model)
else
return View("Details", model)
}
解決
yoursite.com/Tags/のインスタンスを処理する必要があると思います。タグを含むインスタンスのみを処理するためです。
別のルートを作成します:
routes.MapRoute(
"TagsIndex", //Called something different to prevent a conflict with your other route
"Tags/",
new { controller = "Tags", action = "Index" }
);
routes.MapRoute(
"Tags",
"Tags/{tag}",
new { controller = "Tags", action = "Tag", tag = "" }
);
/* In your controller */
public ActionResult Index() // You could add in the id, if you're doing paging here
{
return View("All", model);
}
public ActionResult Tag(string tag, int? id)
{
if (string.IsNullOrEmpty(tag))
{
return RedirectToAction("Index");
}
return View("Details", model);
}
他のヒント
ダンアトキンソンが述べているように追加のルートを作成することに加えて、コントローラーのifステートメントを削除し、タグの詳細を処理する別のコントローラーメソッド(詳細)を作成する必要があります。どのビューを表示するかを決定するコントローラーのifステートメントがコードの匂いです。ルーティングエンジンに任務を任せると、コントローラーコードのメンテナンスがより簡単で簡単になります。
これを処理するためにラムダ式を調べることをお勧めします。将来的には「タグスープ」になる可能性があります。
また、Microsoft.Web.Mvc dllをダウンロードしたことを確認してください。これはSystem.Web.Mvcとは異なります。