2012-07-31 34 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友好名称作为数据库中的附加列,以便您可以根据该列进行查询。