2016-02-12 61 views
0

我正在爲ASP.NET MVC5項目使用MvcSiteMapProvider。我想要顯示基於preservedRouteUrlParamters的動態麪包屑。我有多所大學,每所大學都有課程。我不想列出mvc.sitemap中的所有大學。爲MvcSiteMapProvider顯示基於preservedRouteParameters的動態麪包屑

相反的:

url: /stanford 
breadcrumb: home/university 

url: /stanford/course1 
breadcrumb: home/university/course details 

它應該看起來像:

url: /stanford 
breadcrumb: home/stanford 

url: /stanford/course1 
breadcrumb: home/stanford/course details ...where stanford is link to /stanford 

url: /mit 
breadcrumb: home/mit 

url: /mit/course1 
breadcrumb: home/mit/course details ...where mit is link to /mit 

因此,這是一個模式:

url: /{university} 
breadcrumb: home/{university} 

url: /{university}/{course} 
breadcrumb: home/{university}/course details 

這裏是mvc.sitemap配置我:

<mvcSiteMapNode title="university" controller="Curriculum" action="UniversityDetails" preservedRouteParameters="university"> 
    <mvcSiteMapNode title="course details" action="CourseDetails" preservedRouteParameters="university,course"/> 
</mvcSiteMapNode> 

這是迄今爲止的解決方案,但我不確定這是否是一種好方法。我使用title="{university}"並檢查模式{university}

<mvcSiteMapNode title="{university}" controller="Curriculum" action="UniversityDetails" preservedRouteParameters="university"> 
    <mvcSiteMapNode title="course details" action="CourseDetails" preservedRouteParameters="university,course"/> 
</mvcSiteMapNode> 

我使用SiteMapNodeModel.Url來動態生成麪包屑。

public static string TitleBreadcrumb(this SiteMapNodeModel m) 
{ 
    if (m.Title.StartsWith("{") && m.Title.EndsWith("}")) 
    { 
     return m.Url.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Last(); 
    } 
    return m.Title; 
} 

然後我在SiteMapNodeModel.cshtml顯示模板中使用上述擴展方法。

// use @Model.TitleBreadcrumb() instead of @Model.Title 
<a href="@Model.Url">@Model.TitleBreadcrumb()</a> 

@Model.Description相似。

有沒有更好的方法?

回答

1

唯一特別是錯誤您的方法是,在將HTML顯示在您的HTML中之前,您沒有對該值進行編碼。這意味着一些惡意用戶可能通過操縱URL來將HTML和/或JavaScript注入到您的頁面中。

但是,提供動態標題的最常見方法是使用SiteMapTitleAttribute,它使用模型中的值或ViewData中的值動態地填充標題。

[SiteMapTitle("Name")] 
public ViewResult UniversityDetails(string university) { 
    var model = _repository.Find(university); 

    // Name is a string property of 
    // the university model object. 
    return View(model); 
} 

[SiteMapTitle("Name", Target = AttributeTarget.ParentNode)] 
public ViewResult CourseDetails(string university) { 
    var model = _repository.Find(university); 

    // Name is a string property of 
    // the university model object. 
    return View(model); 
} 
+0

關於「編碼來自URL的值」的好處。 – hIpPy