3

Massive ORM を使用して .Find() メソッドを使用してレコードを取得すると、ASP.MVC 3 ビューとうまく連携しない Massive.DynamicModel.Query オブジェクトが返されます。

コントローラ:

public ViewResult Details(int id)
{
    // Massive ORM Find syntax requires this next statement to use 'dynamic' not 'var'
    dynamic table = new Things();

    // Thing will return as type Massive.DynamicModel.Query
    var Thing = table.Find(ThingId:id); 

    return View(Issue);
}

ビューで @model dynamic と @model Massive.DynamicModel.Query の両方を試しましたが、どちらも通常の @Model.Name 構文を使用して「モノ」オブジェクトのプロパティにアクセスできません。

ここでは、MVC3 ビューで ExpandoObjects を処理する方法についていくつかの議論がありますが、これまでのところ、私のために働いた Massive.DynamicModel.Query 実装については特に何もありません。

Massive.DynamicModel.Query オブジェクトを型指定されたものに変換する一般的なアイデアはありますか?

4

4 に答える 4

4

2つの言葉:モデルを表示します。強く型付けされたビューモデル。これをビューに渡す必要があります。ダイナミクスでも、エキスパンドでも、匿名オブジェクトでも、ViewDataでも、ViewBagでもない=>強く型付けされたビューモデルのみ。したがって、このビューが使用するデータを表すビューモデルを定義することから始めます。次に、リポジトリが吐き出したものをビューに渡すビューモデルに変換するために、コントローラーアクションに必要な処理を実行させます。

この基本的なルールに従わないと、ASP.NETMVCエクスペリエンスがすぐに悪夢に変わる可能性があります。

于 2011-10-06T21:47:14.150 に答える
1

ViewBagすでに動的であるため、最も簡単な方法は使用することだと思います。

MVC 3 よりも Rob の独断的な開発方法に関するものであり、Massive やその他の Rob ツールの使用法について説明しているため、プロダクションをご覧になることをお勧めします。

しかし、本番用のコード サンプル (無料) を確認しなくても、Massive を MVC 3 に統合する方法を確認できます。

https://github.com/tekpub/mvc3

彼の生産コントローラーが次のように見えることがわかります。非常に興味深い方法。

于 2011-10-07T00:37:57.250 に答える
0

匿名型は常に「内部」として注釈が付けられているため、スコープが異なるため、Viewから動的型インスタンスにアクセスすることはできません。

ViewBagを使用するよりも、それを機能させるためのより良い方法を見つけました。そして答えはMono.Cecilです。NuGetから手元に置いてください。

Mono.Cecilのヘルプを使用すると、ASP.NET MVCプロジェクトから生成されたMSILコードを変更し、タイプのアクセス可能な修飾子を「public」に変更できます。

小さなコンソールプログラムを作成し、GitHubでホストします。

コマンドラインからプログラムを呼び出すか、ASP.NETMVCプロジェクトのビルドイベントにビルド後のイベントを追加できます。

"$(SolutionDir)DynamicHelper\bin\Debug\DynamicHelper.exe" "$(TargetPath)"

注意:「DynamicHelper」はコードのプロジェクト名であり、状況に応じて変更できます。

于 2011-10-29T12:26:41.810 に答える
0

現在、ダイナミクスとマッシブを試しています。私は動的viewModelを使用しています:

   public ActionResult Index() {
        _logger.LogInfo("In home");
        dynamic viewModel = new ExpandoObject();
        var data = _tricksTable.Query("SELECT TOP(10) * FROM Tricks ORDER BY DateCreated DESC");
        viewModel.TenTricksNewestFirst = data;

        var data2 = _tricksTable.Query("SELECT TOP(10) * FROM Tricks ORDER BY Votes DESC");
        viewModel.TenTricksMostPopularFirst = data2;
        return View(viewModel);
    }

私の見解では、最初の行で強く型付けされたものへの参照はありません。たとえば、これではありません:

@model IEnumerable<MvcApplication2.Models.Thing>

だから私の見解では、私は次のようなことをします:

@foreach (var item in Model.TenTricksNewestFirst) {
              <div class="post block">
                <div class="tab-image-block">
                    <a href="/tricks/@URL.MakeSpacesMinuses(@item.Name)" title="@item.Name">

                        <img src="/public/images/@item.Thumbnail" alt="@item.Name" class="woo-image thumbnail" /></a>
                </div>
                <h2 class="title">
                    <a href="/video/uncross-your-arms" rel="bookmark" title="@item.Name">@item.Name</a></h2>
                <span class="date">@Dates.ShortDate(@item.DateCreated)</span>
                <span class="likes">Likes: @item.Votes</span>
               </div>
            }

これまでの経験から、私が書くコードはずっと少なくなりました。

于 2011-10-11T23:01:31.020 に答える