メイン ナビゲーションがあり、そのリスト アイテムの 1 つがアクションをレンダリングします。
[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));
}
どうすれば最善の方法で処理できますか?ありがとう!