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中的枚举绑定下拉列表[重复]