ASP.NET MVC / C#:如何从 url 中删除记录 id?

Posted

技术标签:

【中文标题】ASP.NET MVC / C#:如何从 url 中删除记录 id?【英文标题】:ASP.NET MVC / C# : how to remove a record id from url? 【发布时间】:2021-11-12 23:38:17 【问题描述】:

在下面这种情况下,我如何从 url 中删除 ID,其中我从我的数据库中加载记录,其中每条记录都有一个 ID 和记录的 SEO slug 名称。我已经搜索了几十次,但似乎从来没有得到一个有效的答案。

mypictures.com/animal/cat-pictures/1
mypictures.com/animal/dog-pictures/2
mypictures.com/animal/bird-pictures/3

在此示例中,我有一个网站,其中包含不同类别的动物。这些中的每一个都存在于数据库中。猫类有 Animal_Id = 1,狗类有 Animal_Id = 2,鸟类 Animal_Id = 3,依此类推。

我只想显示该类别的 slug,而不是 ID。我正在使用 SEO 友好的网址,因此答案必须考虑到这一点。我知道这样做的一种方法可能是为每条记录设置独特的 slug,但我什至不知道从哪里开始。

下面是我的代码到目前为止的样子,这使得它可以在 url 中使用可怕的 id:

动物控制器:

public ActionResult Details(int? id)

        if (id == null)
        
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        

        tblAnimal tblAnimal = db.tblAnimals.Find(id);            

        if (tblAnimal == null)
        
            return HttpNotFound();
        
                  
        return PartialView("_animalProdListPageLoad", tblAnimal);         

这是调用部分视图 _animalProdListPageLoad 的 cshtml 视图,一旦我们进入动物类别页面,它就会加载动物图片配件列表。这使用了我试图不传递 url 的 id。我将这部分添加到解释中以说明我仍然需要 id 来加载通过Animal_Id 连接到tblAnimalPictures 的内容。在这种情况下,AnimalAccessories 连接到 Animal_Id 表,所以如果有意义的话,我仍然需要我不希望它出现在 URL 中的 ID。

@model mypictures.Models.tblAnimal

@ Html.RenderAction("GetAnimalAccesories", "Animal", new  Animal_Id = Model.Animal_Id );
                                        
                                        @Html.HiddenFor(Model => Model.Animal_Id)

                                        ViewBag.Store_Id_Passed = Model.Animal_Id;
                                    

然后在我的 RouteConfig 我有以下显示 SEO 友好的路线:

routes.Add("AnimalDetails", 
               new SeoFriendlyRoute2("animal/slug/id",
               new RouteValueDictionary(new  controller = "Animal", action = "Details" ),
               new MvcRouteHandler()));

然后我有一个类来处理看起来像这样的 SeoFriendlyRoute2:

public class SeoFriendlyRoute2 : System.Web.Routing.Route

    public SeoFriendlyRoute2(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler)
    
    

    public override RouteData GetRouteData(HttpContextBase httpContext)
    
        var routeData = base.GetRouteData(httpContext);

        if (routeData != null)
        
            if (routeData.Values.ContainsKey("id"))
                routeData.Values["id"] = GetIdValue(routeData.Values["id"]);
        

        return routeData;
    

    private object GetIdValue(object id)
    
        if (id != null)
        
            string idValue = id.ToString();

            var regex = new Regex(@"^(?<id>\d+).*$");
            var match = regex.Match(idValue);

            if (match.Success)
            
                return match.Groups["id"].Value;
            
        

        return id;
    
    
    private object GetslugValue(object slug)
    
        if (slug != null)
        
            string slugValue = slug.ToString();

            var regex = new Regex(@"^(?<id>\d+).*$");
            var match = regex.Match(slugValue);

            if (match.Success)
            
                return match.Groups["id"].Value;
            
        

        return slug;
    

然后在tblAnimal 模型中我有这个,这就是生成 seo url slug 的原因:

public string GenerateSlug2()
                

        string phrase2 = string.Format("0-1", Animal_Id, slug);                        

        string str2 = RemoveAccent2(phrase2).ToLower();
        // invalid chars           
        str2 = Regex.Replace(str2, @"[^a-z0-9\s-]", "");
        // convert multiple spaces into one space   
        str2 = Regex.Replace(str2, @"\s+", " ").Trim();
        // cut and trim 
        str2 = str2.Substring(0, str2.Length <= 45 ? str2.Length : 45).Trim();
        str2 = Regex.Replace(str2, @"\s", "-"); // hyphens   
        return str2;
    

    private string RemoveAccent2(string text)
    
        byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(text);
        return System.Text.Encoding.ASCII.GetString(bytes);
    

最后,当运行应用程序并导航到任何记录(如 Dog)的动物类别时,它看起来像这样:

mypictures.com/animal/dog-pictures/2

但我真的需要这个:

mypictures.com/animal/dog-pictures

请帮帮我,我已经为此困扰了几个月,真的需要一个解决方案。

我已经尝试过了,只是得到一个 404:我从路由配置中删除了 id,因为我认为这是一个可能的解决方案,但事实并非如此。

routes.Add("AnimalDetails", new SeoFriendlyRoute2("animal/slug",
   new RouteValueDictionary(new  controller = "Animal", action = "Details" ),
    new MvcRouteHandler()));

【问题讨论】:

【参考方案1】:

像这样编辑您的路线配置

routes.Add("AnimalDetails", new SeoFriendlyRoute2("animal/slug",
       new RouteValueDictionary(new  controller = "Animal", action = "Details" ),
        new MvcRouteHandler()));

【讨论】:

不起作用。这是我尝试的第一件事,它只返回 404

以上是关于ASP.NET MVC / C#:如何从 url 中删除记录 id?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.net MVC 程序中获取纯 c# 程序中的 JSON 数据?

C# asp.net mvc 创建虚拟目录

如何使用C#从asp.net MVC中的枚举绑定下拉列表[重复]

在asp.net(C#) MVC中如何用htmlhelper 图片链接到另一个页面 !

asp.net mvc怎样传递多个url参数

如何在 asp.net mvc C# 中使用 paypal 交易的交易 ID 获取交易详情?