15

MVC 3 RC2とRavenDBを使用してすばやくシンプルなサイトを構築するだけで、いくつかのことをテストできます。

たくさんのプロジェクトを作成することができましたが、Html.ActionLink()がレイヴンDBIDをどのように処理するかについて興味があります。

私の例:「reasons」(何かの理由、ほとんどはテキストのみ)というドキュメントがあり、理由テキストとリンクのリストがあります。リポジトリを介して、追加、削除、およびその他すべてを正常に実行できます。

以下は、最初のテキストとして編集リンクを使用して、箇条書きに各理由をリストする私のかみそりビューの一部です。

@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>
}

問題

編集リンクを除いて、これは正常に機能します。ここでの値とコードは直接機能しているように見えますが(つまり、リンクが直接起動している)、RavenDBはドキュメントのIDを「reasons/1」として保存します。

したがって、URLが発生してIDが渡されると、結果のルートは「http:// localhost:4976 / Reasons / Edit /reasons/2」になります。したがって、IDは正しく追加されますが、MVCはそれを独自のルートとして解釈しています。

これを回避する方法について何か提案はありますか?それを処理するために特別なルートを作成する必要がありますか、それとも他に何かできることはありますか?

4

3 に答える 3

13

RavenDBの最新バージョンをダウンロードして、試してみました。

public class Entity {
    public int Id { get;set; }
    public string Text { get;set; }
}

RavenDBに保存したとき、RavenのIDは「entities / 1」でしたが、RavenDBクライアントのマッピングでは、データベースにあるIDから必要な整数へのIDを正常に解釈できました。

var entity = session.Load<Entity>(1);
Assert.IsTrue(entity.Id == 1);

拡張メソッドは必要ありません。この方法では、古き良き整数を処理するため、上記のようにルートを変更する必要はありません。文字列IDはほとんど取引を妨げるものでしたが、驚くべきことにこれは機能するため、RavenDBは再び狩りに戻ります。

  • 注:Rob Ashtonの講演を見て、彼のすべてのドキュメントクラスがIdとして整数を持っていることに気付いたので、これを理解しました。
于 2012-02-07T14:47:58.437 に答える
2

私は同様の問題を抱えていて、@jfar が参照する Shiju Varghese ブログ投稿へのリンクを見つける前に、独自の解決策を考え出しました。

ブログ投稿で提供されているソリューションほどクリーンでシンプルではないかもしれませんが、それでもソリューションとして競合できると私は信じています. だからここに行きます:

標準モデル クラスでは、RavenDB を使用する場合、通常、次のような id プロパティがあります。

public string Id { get; set; }

私がしたことは、次のように別の id プロパティを追加することでした:

public int? IdInt
{
    get { return int.Parse(Id.Substring(Id.IndexOf("/") + 1)); }
}

これにより、指定された RavenDB ID の数値部分が得られます。次に、次のようなクラスがありました。

[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 プロパティを除外したことに注意してください。さらに、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);
}

これが機能する理由は、ValueType をパラメーターとして取り、その数値を正しい RavenDB ID に自動的に解決する Load メソッドによるものです。

このアプローチで達成したのは、次のような URL です。

/アイテム/詳細/1

最初に述べたように、この解決策は以前に提案された解決策よりも洗練されていませんが、このアプローチでは、通常どおり ID を操作できるため、よりクリーンな URL が得られます。

于 2011-07-05T22:11:04.977 に答える
0

参考までに、@jfar が投稿したリンクはまさに​​その記事でした。以下は、記事から使用したソリューションです。

解決策 2 - ASP.NET MVC ルートを変更する

次のコードに示すように、Global.asax.cs ファイルの ASP.NET MVC ルートを変更します。

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

RavenDB のデフォルトの ID セパレーターで動作する id 変数の前に「*」を置くだけです

于 2010-12-24T21:16:21.157 に答える