0

問題

私のプロジェクトでは、データベースに格納されたエンティティ「セクション」を使用してカスタム メニュー プロバイダーを実装することにしました。したがって、セクションは次のモデルにマップされます。

public class TopMenuItemModel : BaseTrivitalModel
{
    public TopMenuItemModel()
    {
        ChildItems = new List<TopMenuItemModel>();
    }

    public int ItemId { get; set; }
    public string RouteUrl { get; set; }
    public string Title { get; set; }
    public string SeName { get; set; }

    public IList<TopMenuItemModel> ChildItems { get; set; }
}

モデルのビュー:

@model TopMenuModel
<nav id="main-nav">
    <a href="@Url.RouteUrl("HomePage")">@T("HomePage")</a>
    @foreach (var parentItem in Model.MenuItems)
    { 
        <a href="@Url.RouteUrl("Section", new { seName = parentItem.SeName, sectionId = parentItem.ItemId })">@parentItem.Title</a>
    }
</nav>

私のデフォルトルートは次のとおりです。

routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Trivital.Web.Controllers" }
            );

メニューのコントローラー:

public class CommonController : BaseTrivitalController
    {

...     

public ActionResult TopMenu()
        {
            var sections = _sectionService.GetCollectionByParentId(0, true);
            var model = new TopMenuModel();

            model.MenuItems = sections.Select(x =>
                {
                    var item = new TopMenuItemModel()
                    { 
                        ItemId = x.Id,
                        Title = x.GetLocalized(s => s.Title, _workContext.WorkingLanguage.Id, true, true),
                        SeName = x.GetSeName(),
                        RouteUrl = "",
                    };

                    return item;
                })
                .ToList();

            return PartialView(model);
        }
    }
}

これで、ActionResult メソッドを持つ SectionController ができました。

//section main page
        public ActionResult Section(string seName)
        {
            var section = _sectionService.Get(1);
            if (section == null || section.Deleted || !section.Published)
                return RedirectToAction("Index", "Home");

            //prepare the model
            var model = PrepareSectionPageModel(section);

            return View(model);
        }

セクションの現在のルート (これにより、host/sectionSeName-id が得られます):

routes.MapLocalizedRoute(
                            "section", // Route name
                            "{SeName}"+ "-" + "{sectionId}", // URL with parameters
                            new { controller = "Sections", action = "Section" },
                            new { sectionId = @"\d+" }
                            );

ここで、URL を次のようにする必要があります (ID なし、セクション名のみ):

ホスト/セクションSeName

URLにIDを非表示にして、URLをSEOフレンドリーに見せますが、コントローラーで使用できるようにする方法はありますか?

4

1 に答える 1

1

web.config で urlMappings を利用してみることができます。次のように指定します。

<urlMappings enabled="true">
  <add url="~/somedirectory/" mappedUrl="~/somedirectory/1/"/>
</urlMappings>

とはいえ、各セクションに固有の名前がないと、何も機能しないと思います。そうしないと、競合する URL がいくつか発生します。

また、IIS の書き換えモジュールを使用して、いくつかのカスタム作業を行うことを検討することもできます。

http://www.iis.net/learn/extensions/url-rewrite-module/using-the-url-rewrite-module

私が働いている会社は、あなたの状況に似た KB 記事システムにこれを使用しており、かなりうまく機能しています。(フォルダ/ID)

于 2012-11-01T06:42:22.160 に答える