2012-07-31 3 views
0

J'ai un menu principal et l'un de ses éléments de liste rend une action:Routage ASP.NET MVC. Espaces blancs et les catégories

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

GetItems méthode est:

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

Lorsque vous rédigez un article on peut spécifier la catégorie comme ceci: Fringe Division. Donc, dans la barre d'adresse, il ressemble à Fringe%20Division.

l'intérieur d'une vue (menu partiel) J'ai ceci:

@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> 

Si je demande ici quelque chose comme category = Url.ToUrlFriendly(link) (remplaçant tous les caractères inacceptables avec des tirets, ou avec tout autre caractères), alors qu'il a l'air cool dans la barre d'adresse mon contrôleur ne reconnaît pas la catégorie (et qui est évidente: il se distingue de son original):

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

Comment puis-je gérer la meilleure façon? Merci!

Répondre

0

Vous devez le faire également dans l'ordre inverse. Si vous encodez quelque chose (par exemple remplacer l'espace par un tiret), vous devez décoder (remplacer le tableau de bord par un espace). Similaire à Server.Encode et Server.Decode opposé. Ecrire une fonction Url.DecodeUrlFriendly. Mais faites attention si votre chaîne contient déjà un tiret.

0

Je pense que la meilleure chose pour cela, est de stocker une partie url catégorie de l'URL, par exemple, pour Fringe Division, utilisez quelque chose comme fringe-division, qui est stocké à côté de l'information de catégorie. De cette façon, il persiste pour la catégorie dans la base de données et uri.

Vous pouvez intégrer la génération de cet élément url à votre CMS si vous en avez un.

0

Généralement, vous devez conserver le nom convivial de la catégorie en tant que colonne supplémentaire dans la base de données afin de pouvoir effectuer une requête.