0

设想:

有两个实体说“书籍”和“书评”。可以有多本书,每本书可以有多个评论。

每篇评论和书籍都应该有一个单独的永久链接。用户可以使用单独的输入表单添加书籍和评论。一旦添加任何书籍/评论,就应该可以通过其永久链接访问它。

任何人都可以指出我应该如何实施的正确方向?

4

1 回答 1

3

网址路由将开箱即用地处理此问题,无需额外的实际工作。

只需创建一个 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})
于 2011-01-01T16:47:06.180 回答