0

次のフラットな 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();
    }
}
4

1 に答える 1

1

ヘルパーを使用する場合とは反対の立場から ActionLink ヘルパーの使用に取り組んでいます。実際にはRazorがあなたのためにやろうとしているのに、リンクのルーティングされたURLがどうあるべきかをRazorに伝えようとしています。したがって、mywebsite/service-option-oneの例では、書き留めておくべき唯一の場所はservice-option-oneルート マップです。あなたの見解では、あなたはやるべきです

@Html.ActionLink("The Anchor Text You Want To Display","Option1","Home")

次に、Razor がビューをレンダリングすると、次のように変換されます。

<a href="mywebsite/service-option-one">The Anchor Text You Want To Display</a>

http://msdn.microsoft.com/en-us/library/dd505070(v=vs.118).aspx

于 2013-12-19T20:05:31.803 に答える