次のフラットな URL 構造を持つようにルートをセットアップしました。
mywebsite/service-option-one (goes to Home Controller, Option1 action)
mywebsite/service-option-two (goes to Home Controller, Option2 action)
mywebsite/ (goes to Home Controller, Index)
mywebsite/about (goes to Home Controller, Index with path=about)
mywebsite/contact (goes to Home Controller, Index with path=contact)
多くのコンテンツ ビューがあり、これらの一般的な情報ページに対して個別のアクションを実行したくないため、これは重要です。ビューを解決するための簡単なコードは、この投稿の最後にあります。
メニューを作成するときに MVCHtml.ActionLink
ヘルパーが、これらのアクションが存在しないため意味のある一般的なコンテンツに誤ったアドレスを提供します!
私のアドレススキームを考えると、アンカーリンクのターゲットを設定するために使用できるヘルパーメソッドはありますか、それとも html でハードコーディングする必要がありますか (つまり<a href="~/contact>Contact us</a>
)?
// note that the order of the routes is very important!
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// error route
routes.MapRoute(
"Error", // Route name
"Oops", // URL with parameters
new { controller = "Home", action = "Error" }
);
routes.MapRoute(
"Service1",
"service-option-one",
new { controller = "Home", action = "Option1" }
);
routes.MapRoute(
"Service2",
"service-option-two",
new { controller = "Home", action = "Option1" }
);
// default home controller route for general site content (/content), uses default path value set to Index
routes.MapRoute(
name: "Catchall",
url: "{path}",
defaults: new { controller = "Home", action = "Index", path = "Index" }
);
// home page route, blank url (/)
routes.MapRoute(
"HomePage", // Route name
"", // URL with parameters
new { controller = "Home", action = "Index" }
);
// default route
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "{controller}", action = "{action}", id = UrlParameter.Optional } // Parameter defaults
);
}
public class HomeController : Controller
{
private bool ViewExists(string name)
{
ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null);
return (result.View != null);
}
public ActionResult Index(string path)
{
System.Diagnostics.Debug.WriteLine("looking for..." + path);
if (ViewExists(path)==true)
{
System.Diagnostics.Debug.WriteLine("general controller action...");
return View(path);
}
else
{
System.Diagnostics.Debug.WriteLine("page not found...");
return RedirectToRoute("Error");
}
}
public ActionResult Error()
{
return View();
}
public ActionResult Option1()
{
return View();
}
public ActionResult Option2()
{
return View();
}
}