การสร้างแผนผังไซต์ MvcSiteMapProvider ด้วยการกำหนดเส้นทาง MVC Attrivbute

ฉันกำลังทำงานในโปรเจ็กต์ MVC5 ซึ่งฉันต้องสร้างแผนผังไซต์

ฉันได้สร้างเส้นทางของฉันโดยใช้แอตทริบิวต์เส้นทางในการดำเนินการของคอนโทรลเลอร์

ฉันกำลังใช้ผู้ให้บริการโหนดไดนามิกตามที่ระบุไว้ในเอกสารประกอบสำหรับ MvcSiteMapProvider และทำงานได้ดีสำหรับหนึ่งในคอนโทรลเลอร์ของฉัน แต่สำหรับอีกตัวควบคุมหนึ่งกำลังแสดงพารามิเตอร์สตริงการสืบค้นสำหรับแต่ละเส้นทางที่แมป

ฉันได้รับ

www.url.com?SelectedCulture=en-gb

เมื่อฉันคาดหวัง

www.url.com/en-gb

เส้นทางของฉันทำงานได้ดีทั้งหมด และหากฉันใช้แอปพลิเคชันของฉัน มันก็ทำงานได้ดีเช่นกัน... เพียงแต่ไม่ได้สร้างแผนผังไซต์ที่ฉันคาดหวังไว้

ผู้ให้บริการแบบไดนามิกที่ฉันสร้างขึ้นกำลังเติมแอตทริบิวต์ที่จำเป็นซึ่งตรงกับเส้นทาง

ใครมีความคิดใด ๆ ?

นี่คือ Mvc.sitemap xml ของฉัน

<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;
            }
        }
    }
}

และนี่คือการดำเนินการของผู้ควบคุมของฉัน:

[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();
    }

ขอบคุณ!


person Bynho    schedule 14.05.2014    source แหล่งที่มา


คำตอบ (2)


ช่างน่าอายเหลือเกิน... ปัญหาเกิดจากการสะกดรหัสค่าเส้นทางผิดในผู้ให้บริการโหนด!

person Bynho    schedule 14.05.2014

ฉันไม่เคยใช้ AttributeRouting แต่เท่าที่ฉันรู้ว่ามันใช้งานได้เหมือนกับการประกาศเส้นทางของคุณในคลาส RouteConfig

การกำหนดเส้นทางมี 2 ส่วน 1) การแก้ไข URL ขาเข้าให้ตรงกับชุดของ RouteValues ​​และ 2) การแก้ไข URL ออกจากชุดของ RouteValues เป็น URL ขาออก (บางครั้งเรียกว่า URL ขาออก) ที่คุณต้องแน่ใจว่าได้รับการกำหนดค่าอย่างถูกต้องเพื่อให้ MvcSiteMapProvider สร้าง URL ที่ถูกต้อง

ตามที่อธิบายไว้ใน การควบคุมพฤติกรรมของ URL URL ได้รับการแก้ไขโดยคลาส UrlHelper ของกรอบงาน MVC คุณสามารถใช้โค้ดต่อไปนี้ในการทำงานของคอนโทรลเลอร์เพื่อดูว่าคุณสามารถสร้าง URL ที่ถูกต้องโดยใช้ MVC แล้วทำงานแบบย้อนกลับได้หรือไม่ ฉันขอแนะนำให้คุณเริ่มต้นด้วยการกำหนดค่าเส้นทางของคุณก่อนโดยใช้คลาส RouteConfig ตรวจสอบให้แน่ใจว่าคุณได้รับ URL ที่ถูกต้อง จากนั้นลองค้นหานิพจน์ที่เทียบเท่าสำหรับ AttributeRouting (อาจเป็น .

// 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" } });

หมายเหตุ: คุณสามารถทำให้ MvcSiteMapProvider ปรับขนาดได้ดีขึ้นมากหากคุณใช้การแปลในตัวพร้อมกับ preservedRouteParameters แทนที่จะสร้างโหนดสำหรับแต่ละวัฒนธรรม ตามที่อธิบายไว้ใน คำตอบนี้

person NightOwl888    schedule 14.05.2014
comment
ขอบคุณสำหรับคำตอบอย่างละเอียด มันเป็นความผิดพลาดที่โง่เขลาของฉัน! - person Bynho; 14.05.2014