RavenDB Ids和ASP.NET MVC3路由

Sea*_*een 15 asp.net-mvc actionlink ravendb asp.net-mvc-3

只需使用MVC 3 RC2和RavenDB构建一个快速,简单的站点来测试一些东西.

我已经能够制作一堆项目,但我很好奇Html.ActionLink()如何处理乌鸦数据库ID.

我的例子:我有一个名为"reason"的文档(一个事情的原因,主要是文本),它有原因文本和链接列表.我可以通过我的存储库添加,删除和完成其他所有操作.

下面是我的剃刀视图的一部分,它列出了项目符号列表中的每个原因,并将编辑链接作为第一个文本:

@foreach(var Reason in ViewBag.ReasonsList)
{
    <li>@Html.ActionLink("Edit", "Reasons", "Edit", new { id = Reason.Id }, null) @Reason.ReasonText</li>
    <ul>
    @foreach (var reasonlink in Reason.ReasonLinks)
    { 
        <li><a href="@reasonlink.URL">@reasonlink.URL</a></li>
    }
    </ul>
}
Run Code Online (Sandbox Code Playgroud)

问题

除编辑链接外,此方法正常.虽然这里的值和代码似乎直接起作用(即链接直接触发),但RavenDB将我的文档ID保存为"reason/1".

因此,当URL发生并且它传递ID时,结果路由是"http:// localhost:4976/Reasons/Edit/reasons/2".因此,ID被正确附加,但MVC将其解释为自己的路由.

关于我如何能够解决这个问题的任何建议?我是否需要创建一个特殊的路线来处理它或者我还能做些什么吗?

Kha*_*meh 13

我刚刚下载了最新版本的RavenDB并试了一下.

public class Entity {
    public int Id { get;set; }
    public string Text { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

当我将它保存到RavenDB时,Raven中的id是"entities/1",但是RavenDB客户端中的映射能够成功地将Id从数据库中的内容解释为我想要的整数.

var entity = session.Load<Entity>(1);
Assert.IsTrue(entity.Id == 1);
Run Code Online (Sandbox Code Playgroud)

你不需要扩展方法,这样你就不需要改变上面提到的任何路由,因为你将处理好的整数.字符串ID几乎是一个交易破坏者,但令人惊讶的是这是有效的,所以RavenDB又回来了.

  • 注意:我通过观看Rob Ashton的谈话并意识到他所有的文档类都有整数作为Ids来解决这个问题.

  • 警告!这种在实体类中使用整数id的方法在开始使用索引和map reduce等时会产生很多痛苦的副作用.这是一个陷阱,我强烈建议使用字符串Id:s并在必要时转换为整数(urls等) .[这篇文章](http://kijanawoodard.com/just-use-string-id-for-ravendb)是非常真实的恕我直言,我自己在整数ids的一些经验. (3认同)

Sea*_*een 0

仅供参考,@jfar 发布的链接正是该文章。以下是我在文章中使用的解决方案:

解决方案 2 - 修改 ASP.NET MVC 路由

修改Global.asax.cs文件中的ASP.NET MVC路由,如下代码所示:

 routes.MapRoute(
     "WithParam",                                           // Route name
     "{controller}/{action}/{*id}"                         // URL with parameters
     );  
Run Code Online (Sandbox Code Playgroud)

我们只需将“*”放在 id 变量前面,该变量将与 RavenDB 的默认 Id 分隔符一起使用