Pembuatan Peta Situs MvcSiteMapProvider dengan Perutean Atribut MVC

Saya sedang mengerjakan proyek MVC5 di mana saya perlu membuat peta situs.

Saya telah membuat rute saya menggunakan Atribut Rute pada tindakan pengontrol.

Saya menggunakan penyedia simpul Dinamis seperti yang ditentukan dalam dokumentasi untuk MvcSiteMapProvider dan berfungsi dengan baik untuk salah satu pengontrol saya, namun untuk pengontrol lainnya ia menampilkan parameter string kueri untuk setiap rute yang dipetakan jadi misalnya

saya mengerti

www.url.com?SelectedCulture=en-gb

ketika aku mengharapkannya

www.url.com/en-gb

Semua rute saya berfungsi dengan baik dan jika saya menggunakan aplikasi saya, itu juga berfungsi dengan baik... Itu tidak membuat peta situs yang saya harapkan

Penyedia Dinamis yang saya buat sedang mengisi atribut yang diperlukan yang cocok dengan rute.

Adakah yang punya ide?

Ini adalah Mvc.sitemap xml saya

<mvcSiteMapNode title="ATitle" controller="Parent" action="Index" key="Home">
<mvcSiteMapNode title="ASubTitle" controller="Parent" action="Index" key="CulturePages">
</mvcSiteMapNode>

This is my dynamicNodeProvider

public class SitePagesDynamicProvider : DynamicNodeProviderBase
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        using (var ef = new EntityFrameworkRepository())
        {
            // Create a node for each sites 
            foreach (var obj in ef.GetIDs();
            {
                DynamicNode dynamicNode;

                    dynamicNode = new DynamicNode();
                    dynamicNode.Title = obj.title;
                    dynamicNode.ParentKey = "CulturePages";
                    dynamicNode.RouteValues.Add("SelectedCulture", obj.culture);
                    yield return dynamicNode;
            }
        }
    }
}

Dan inilah Tindakan Pengontrol saya:

[MvcSiteMapNodeAttribute(Title = "Sites", Key = "Sites", ParentKey = "HomePages", DynamicNodeProvider = "TestProject.Models.SitePagesDynamicProvider, TestProject")]
    [Route("{SelectedCulture:regex(^([a-z]|[A-Z]){2}-([a-z]|[A-Z]){2}?$)?}/")]
    public ActionResult Index(string SelectedCulture)
    {
       return View();
    }

Terima kasih!


person Bynho    schedule 14.05.2014    source sumber


Jawaban (2)


Memalukan sekali... Masalah terjadi karena salah mengeja id nilai rute di penyedia node!

person Bynho    schedule 14.05.2014

Saya belum pernah menggunakan AttributeRouting, tetapi sejauh yang saya tahu ini berfungsi seperti mendeklarasikan rute Anda di kelas RouteConfig.

Perutean memiliki 2 bagian 1) menyelesaikan URL masuk agar cocok dengan kumpulan RouteValues ​​dan 2) menyelesaikan URL keluar dari kumpulan RouteValues. Ini adalah URL keluar (terkadang disebut URL keluar) yang perlu Anda pastikan dikonfigurasi dengan benar agar MvcSiteMapProvider menghasilkan URL yang benar.

Seperti yang dijelaskan dalam Mengontrol Perilaku URL, URL diselesaikan oleh kelas UrlHelper kerangka MVC. Anda dapat menggunakan kode berikut dalam tindakan pengontrol untuk melihat apakah Anda dapat menghasilkan URL yang benar menggunakan MVC dan kemudian bekerja mundur. Saya sarankan Anda memulai dengan terlebih dahulu mengonfigurasi rute Anda menggunakan kelas RouteConfig, memastikan Anda mendapatkan URL yang benar, dan kemudian mencoba menemukan ekspresi yang setara untuk AttributeRouting (mungkin dengan .

// Using controller and action
var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData));
var url = urlHelper.Action("Index", "Parent", new System.Web.Routing.RouteValueDictionary { { "SelectedCulture", "en-gb" } });

Catatan: Anda dapat membuat skala MvcSiteMapProvider jauh lebih baik jika Anda menggunakan lokalisasi bawaan bersama dengan PreservedRouteParameters daripada membuat node untuk setiap budaya, seperti yang dijelaskan dalam jawaban ini.

person NightOwl888    schedule 14.05.2014
comment
Terima kasih atas jawaban menyeluruh Anda. Itu karena kesalahan ketik yang konyol di pihak saya! - person Bynho; 14.05.2014