У меня была похожая проблема, и я нашел собственное решение, прежде чем нашел ссылку на пост в блоге Шиджу Варгезе, на который ссылается @ jfar.
Возможно, он не такой простой и понятный, как решения, представленные в сообщении в блоге, но я уверен, что он может конкурировать как решение, тем не менее. Итак, вот так:
В стандартном классе модели при использовании RavenDB у нас обычно есть свойство id, например, так:
public string Id { get; set; }
Что я сделал, так это добавил еще одно свойство id, например:
public int? IdInt
{
get { return int.Parse(Id.Substring(Id.IndexOf("/") + 1)); }
}
Это даст нам номерную часть данного идентификатора RavenDB.
У меня тогда был класс, который выглядел примерно так:
[Bind(Exclude = "IdInt")]
public class Item
{
public string Id { get; set; }
public int? IdInt
{
get { return int.Parse(Id.Substring(Id.IndexOf("/") + 1)); }
}
...
}
Обратите внимание, что я исключил свойство IdInt, так как не хочу, чтобы связыватель модели обрабатывал его.
Кроме того, обратите внимание, что свойство IdInt имеет значение null. Это позволит избежать проблем с подшивкой модели в дальнейшем, когда мы создаем новые элементы, а свойство Id равно null.
Тогда в маршрутах я объявил правило, подобное этому:
routes.MapRoute(
"WithParam", // Route name
"{controller}/{action}/{id}" // URL with parameters
);
Позже, используя ActionLink или что-то подобное, мы можем сделать следующее:
@Html.ActionLink("Details", "Details", new { id = item.IdInt })
И, наконец, когда мы нажимаем предоставленную ссылку, нас отправляют на соответствующее действие, которое может выглядеть примерно так:
public ActionResult Details(int id)
{
var item = _session.Load<Item>(id);
return View(item);
}
Причина, по которой это будет работать, заключается в методе Load, который принимает ValueType в качестве параметра, а затем автоматически разрешает число в правильный идентификатор RavenDB.
То, что мы достигли с помощью этого подхода, - это URL, который выглядит примерно так:
/ элементы / детали / 1
Как я уже говорил в начале, это решение менее элегантно, чем предыдущие предложенные решения, однако этот подход даст вам более чистый URL-адрес, поскольку вы можете работать с идентификаторами, как обычно.