2017-05-04 1 views
-3

Je suis confronté à un problème dans mon projet actuel où je veux afficher des URL personnalisées pour mes pages. J'ai essayé beaucoup de techniques mais aucune d'entre elles ne répond à mes exigences. Je veux URL comme ceci:Wordpress Type de blog Permalink dans MVC (Custom URL Routing)

http://www.anyDomain.com/What-Is-Your-Name 

Actuellement, je suis en mesure de définir l'URL comme ceci:

http://www.anyDomain.com/What-Is-Your-Name?Id=1 

Je veux ignorer Querystring d'URL. Alors que le contrôleur peut identifier la demande & répondre en conséquence.

Ici, Id est utilisé pour extraire les détails de la base de données. Comment puis-je passer la valeur de paramètre de View à Controller afin qu'il puisse identifier la demande sans l'ajouter dans l'URL?

Mon contrôleur

[Route("~/{CategoryName}")] 
public ActionResult PropertyDetails(int Id) 
{ 
} 

RouteConfig

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.MapMvcAttributeRoutes(); 
routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}", 
    defaults: 
    new 
    { 
     controller = "Home", 
     action = "Index", 

    } 
); 

Mon Voir

<a href="@Url.Action("PropertyDetails", "Home", new {@Id=item.ID,@CategoryName = Item.Title })"> 

Je viens de remarquer, je veux URL comme StackOverflow est d'utiliser

http://stackoverflow.com/questions/43774917/wordpress-blog-type-permalink-in-mvccustom-url-routing 
+0

Je pense que cette URL résoudre sûrement votre problème s'il vous plaît, essayez ceci: http://www.jerriepelser.com/blog/generate-seo-friendly-urls-aspnet-mvc/ – stylishCoder

+0

Voir [Niveaux multiples dans le routage personnalisé MVC] (https://stackoverflow.com/a/31958586/181087). – NightOwl888

Répondre

3

utilisant le routage d'attributs pour inclure la id et un title, le contrôleur peut ressembler à ceci

public class HomeController : Controller { 
    [HttpGet] 
    [Route("{id:int}/{*slug}")] //Matches GET 43774917/wordpress-blog-type-permalink-in-mvccustom-url-routing 
    public ActionResult PropertyDetails(int id, string slug = null) { 
     //...code removed for brevity 
    } 

    //...other actions 
} 

Cela correspond à des itinéraires similaires que vous avez observé avec ce que StackOverflow utilise.

Dans la vue lors de la génération de vos URL, vous pouvez tirer parti des modèles pour générer le format souhaité.

<a href="@Url.Action("PropertyDetails", "Home", new { @id=item.ID, @slug = item.Title.ToUrlSlug() })"> 

Le ToUrlSlug() peut être une méthode d'extension pour convertir le titre de modèle à votre format souhaité word-word-word

public static class UrlSlugExtension { 

    public static string ToUrlSlug(this string value) { 
     if (string.IsNullOrWhiteSpace(value)) return string.Empty; 
     //this can still be improved to remove invalid URL characters 
     var tokens = value.Trim().Split(new char[] { ' ', '(', ')' }, StringSplitOptions.RemoveEmptyEntries); 

     return string.Join("-", tokens).ToLower(); 
    } 
} 

trouvé une réponse ici sur la façon de générer la limace

How does Stack Overflow generate its SEO-friendly URLs?

Avec cela, l'URL personnalisée ressemblerait à quelque chose comme

http://www.yourdomain.com/123456/what-is-your-name 

pour un item avec un ID de 123456 et un titre de « Quel est votre nom »