web-dev-qa-db-ja.com

.NetMVCでのURL書き換え

MVCでURLを処理するための最良の方法は何でしょうか。たとえば、私のアプリケーションでは、PageController/website/Page/Index/3または/website/Page/homeにリンクできます。メニューは、受信URLに基​​づいてHtml.ActionLink()とT4MVCを使用して動的に構築されるため、ハードコーディングされたものはありません。

ここで、URLとリンクを、たとえば/website/our-company/などのSEOに適したものにポイントし、/website/our-company/location//website/our-company/employees/などの子を含めることもできます。あなたはその考えを理解します。

すべてのページがBDに保存され、オブジェクトにFriendlyUrlプロパティとparentIdプロパティがあります。

それを行うための最良の方法は何ですか?

12
VinnyG

http://www.asp.net/learn/mvc/tutorial-23-cs.aspx を調べて、動作させました。思ったより簡単...

私のルート:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute("Pages3", "{url1}/{url2}/{url3}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" });
    routes.MapRoute("Pages2", "{url1}/{url2}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" });
    routes.MapRoute("Pages1", "{url1}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" });
}

そして今、私のコントローラー:

public virtual ActionResult RedirectTo(string url1, string url2, string url3)
{
    if (string.IsNullOrEmpty(url1)) return Home();

    var pageModel = new PageModel();
    pageModel.CurrentPage = _pageRepo.GetByUrl(url1, url2, url3);
    BuildMenusAndBreadCrumb(pageModel);
    ViewData.Model = pageModel;

    return View(Views.Index);
}

そして、これが私がリンクをレンダリングする方法です(私のメニューの例):

<div class="header_menu_content">
<ul id="main_menu_header">
    <% foreach(var item in Model) {%>
        <% if(item.Children != null){ %>
            <li><%= Html.ActionLink(item.Title, MVC.Page.RedirectTo(item.Url, "", ""))%>
            <ul>
            <% foreach (var child in item.Children){ %>
                <li><%= Html.ActionLink(child.Title, MVC.Page.RedirectTo(item.Url, child.Url, "")) %></li>
            <% }%>
            </ul>
            </li>
        <% } else { %>
            <li class="nochild"><%= Html.ActionLink(item.Title, MVC.Page.RedirectTo(item.Url, "", "")) %></li>
        <% } %>
    <%} %>
</ul>

私のニーズにぴったりです!質問やコメントがあれば恥ずかしがらないでください!それが最善の方法かどうかはわかりませんが、満足しています。

ルートの順序が重要であることに注意してください。また、デフォルト値を入力せず、url2 =何か(サイト/セクション/ページ)のページにいる場合、すべてのリンクはサイト/新しいセクションを指しますか?url2 = page takeそのurl2パラメータがなぜそこにあったのか理解するのにしばらく時間がかかりましたが、今は大丈夫です!

6
VinnyG