0

我有一个主导航,其中一个列表项呈现一个动作:

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

我如何以最好的方式处理它?谢谢!

4

3 回答 3

0

我认为最好的办法是存储一个对 url 友好的类别 url 部分,例如,for Fringe Division,使用类似的东西fringe-division,它与类别信息一起存储。这样,它会在数据库和 uri 中保留类别。

如果你有的话,你可以让这个 url 组件的生成成为你的 CMS 的一部分。

于 2012-07-31T10:20:24.557 回答
0

通常,您会将类别的 URL 友好名称作为附加列保存在数据库中,以便您可以针对该列进行查询。

于 2012-07-31T10:20:44.853 回答
0

您还必须以相反的顺序执行此操作。如果您对某些内容进行编码(例如用破折号替换空格),那么您必须解码(用空格替换破折号)。类似于 Server.Encode 和相反的 Server.Decode。写一些 Url.DecodeUrlFriendly 函数。但如果您的字符串已经包含破折号,请小心。

于 2012-07-31T10:19:48.380 回答