2012-07-31 29 views
0

我有一個主導航和一個列表項呈現一個動作:ASP.NET MVC路由。空格和類別

[ChildActionOnly] 
public ActionResult BuildMenu(String category = null) { 
    ViewBag.SelectedCategory = category; 
    return View("~/Views/Article/CategoriesList.cshtml", this.GetItems()); 
} 

哪裏GetItems方法是:

[NonAction] 
public IEnumerable<String> GetItems() { 
    return this.session.Query<Article>() 
     .Select(x => x.Category) 
     .Distinct().ToList() 
     .OrderBy(x => x); 
} 

在發佈的第一個可以指定喜歡的類別這個:Fringe Division。所以在地址欄中看起來像Fringe%20Division

內部的視圖(菜單部分)我有這樣的:

@model IEnumerable<String> 
@{ Layout = null; } 

<ul class="transparent-custom"> 
@foreach(var link in Model) { 
    <li>@Html.RouteLink(
     link, 
     new { 
      controller = "Article", action = "Index", 
      category = link 
     }, 
     new { 
      @class = link == ViewBag.SelectedCategory ? "selected" : "" 
     } 
    ) 
    </li> 
} 
</ul> 

如果我在這裏適用類似category = Url.ToUrlFriendly(link)(更換所有不可接受的字符用破折號,或與任何其他字符),而它會在地址欄酷我的控制器不識別類別(這是顯而易見的:它從原來的不同):

public ActionResult Index(String category, Int32? page) { 

    // there's no such a category in DB... 

    ViewBag.CurrentCategory = category; 
    if(category == "All") { 
     return View(this.GetAllArticles().ToPagedList(page ?? 1, this.PageSize)); 
    } 
    var entries = this.session.Query<Article>() 
     .Where(c => c.Category == category) 
     .OrderBy(d => d.CreatedOn); 
     return View(entries.ToPagedList(page ?? 1, this.PageSize)); 
    } 

如何處理它的最佳方式? 謝謝!

回答

0

你必須以相反的順序去做。如果你編碼的東西(比如用短劃線替換空格),那麼你必須解碼(用空格替換短劃線)。類似於Server.Encode和Server.Decode。寫一些Url.DecodeUrlFriendly函數。但是,如果你的字符串已經包含破折號,請注意。

0

我認爲最好的辦法是存儲適合網址的類別url部分,例如Fringe Division,使用類似fringe-division的東西,它與類別信息一起存儲。這樣,它就會保留數據庫和uri中的類別。

如果您有CMS的話,您可以生成此CMS組件的一部分。

0

通常,您應該將該類別的URL友好名稱作爲數據庫中的附加列,以便您可以根據該列進行查詢。