设想:
有两个实体说“书籍”和“书评”。可以有多本书,每本书可以有多个评论。
每篇评论和书籍都应该有一个单独的永久链接。用户可以使用单独的输入表单添加书籍和评论。一旦添加任何书籍/评论,就应该可以通过其永久链接访问它。
任何人都可以指出我应该如何实施的正确方向?
设想:
有两个实体说“书籍”和“书评”。可以有多本书,每本书可以有多个评论。
每篇评论和书籍都应该有一个单独的永久链接。用户可以使用单独的输入表单添加书籍和评论。一旦添加任何书籍/评论,就应该可以通过其永久链接访问它。
任何人都可以指出我应该如何实施的正确方向?
网址路由将开箱即用地处理此问题,无需额外的实际工作。
只需创建一个 Books 或 BookReviews 控制器。创建一个采用 Id 的操作方法
您将拥有基本的永久链接,例如 /Books/Details/1 和 /BookReviews/Details/4
如果您对这样的永久链接感到满意,那么您就可以开始了。:)
但是,如果你想更进一步,让它对搜索引擎更友好,需要做更多的工作......
首先,您应该创建或找到一个简单的“slug”编码器,它将接受一个字符串(可能是书名或评论者的标题)并将任何非字母数字字符编码为 - 或类似字符。C#中的URL Slugify算法?
现在我们可以创建一个类似的路线
书籍/{title}-{id}
routes.MapRoute(
"BooksSeoRoute",
"Books/{slug}-{id}",
new { controller = "Books", action = "Details" } // Parameter defaults
);
所以我们最终得到的永久链接看起来像:Books/The-Title-Of-The-Book-38
对于书评,您可能希望采用“嵌套”方法,以便您可以使用
routes.MapRoute(
"BookReviewsSeoRoute",
"Books/{book-slug}/{slug}-{id}",
new { controller = "BookReviews", action = "Details" } // Parameter defaults
);
书籍/The-The-Of-The-Book-38/Review-by-John-Smith-24
您可以将 slug 字段添加到您的模型/实体/数据库,或者您可以添加一个 getter,它将从您的标题/作者动态生成它
IE
public class Book {
public string Id {get;set;}
public string Title {get;set;}
public string Slug
get
{
return SlugEncoder.EncodeString(this.Title);
}
}
在你看来
=Html.ActionLink("Permalink","Details","Book",new{@Id=Model.Id, @Slug=Model.Slug})