2012-01-06 62 views
0

我无法为Title书写单词,所以我解释了我正在寻找的内容。实现产品/ Apple-ipad代替产品/ Index/23

目前,我在View中使用以下ActionLink代码。

@Html.ActionLink(@product.Name, "Index", "Product", new { id = @product.Id }, null) 

此代码重定向到下面的操作方法,在产品控制器现在

public ActionResult Index(int id) 
{ 
    Product product = pe.Products.Where(p => p.Id == id).First(); 
    ViewBag.Title = product.Name; 
    ViewBag.Description = product.MetaDescription; 
    ViewBag.Keywords = product.MetaKeywords; 
    return View(product); 
} 

,我想要的东西:不是mysite.com/Product/Index/22,我的网址应该是这样的mysite.com/Product/Apple-ipad

我知道,我可以使用产品名称代替Id并将其传递给操作方法。但是,这种方式我认为查询会变慢,因为Id字段被索引,但Name不是。这是我唯一的选择吗?让我知道你将如何处理这个要求。

回答

1

在路线中使用产品名称而不是ID,并将nonclustered index放在数据库的产品名称列中。

这样你就不会在select上获得性能(尽管你会在插入/更新/删除时得到一个,但是我怀疑这些会比选择少得多)。

CREATE INDEX IX_[index_name] 
ON [schema].[table_name] ([column_name]); 

我在几个地方见过使用同时使用的名称和类似mysite.com/Product/Apple-ipad/22 ID的其他方式。该名称实际上并未被代码使用,它只是用于搜索引擎优化。这样做的一个主要缺点是,不喜欢你的网站的人可以通过各种网址将互联网上的相同内容导向谷歌找到。谷歌不喜欢这样,所以你的网站受到处罚,你比以前更糟糕。

+0

我已经看到了SO使用数字(我怀疑Id)和问题的标题。你如何看待这些人正在管理这个 – 2012-01-06 07:55:01

+0

顺便说一句,我不能理解你的第一种方法。你是什​​么意思,通过使用非聚集索引。你可以把一个小的代码,可以帮助或一点解释....感谢 – 2012-01-06 08:01:34

+1

注册全球asax路线: routes.MapRoute( “Product”, “{controller}/{action}/{id}/{ productname}“, new {controller =”Product“,action =”Index“,id =”“,productName =”“} ); 然后在控制器中,你只能看到id,因为它是唯一对你感兴趣的。 – linkerro 2012-01-06 08:05:17