如何将大规模ORM动态查询输出到MVC 3视图?

时间:2011-10-06 21:44:42

标签: asp.net-mvc-3 massive

当我使用Massive ORM使用.Find()方法检索记录时,它会返回一个Massive.DynamicModel.Query对象,该对象与ASP.MVC 3视图不能很好地融合。

控制器:

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);
}

在View中,我尝试了@model动态和@model Massive.DynamicModel.Query,但两者都不允许我使用普通的@ Model.Name语法访问我的'Thing'对象的属性。

这里有一些关于如何使用MVC3视图处理ExpandoObjects的讨论,但是到目前为止对我有用的Massive.DynamicModel.Query实现没什么特别的。

如何将Massive.DynamicModel.Query对象转换为键入的内容?

4 个答案:

答案 0 :(得分:4)

两个字:查看模型。强类型视图模型,这是您应该传递给您的视图。不是动态,不是expandos,不是匿名对象,不是ViewData,不是ViewBag =>只有强类型的视图模型。因此,首先定义一个视图模型,该模型将表示此视图将使用的数据。然后让您的控制器操作执行必要的操作,以便将您的存储库吐出的任何内容转换为将传递给视图的视图模型。

如果不遵循此基本规则,您的ASP.NET MVC体验很快就会变成一场噩梦。

答案 1 :(得分:1)

我认为最简单的方法是使用ViewBag,因为它已经是动态的。

你最好看一下制作,因为它是关于Rob的开发方式而不是关于MVC 3,并描述了使用Massive和其他Rob工具。

但即使你不确定在这里检查生产的代码样本(免费),看看他如何将Massive集成到MVC 3:

https://github.com/tekpub/mvc3

你可以看到他的生产控制器看起来像。非常有趣的方式。

答案 2 :(得分:0)

我现在正在尝试动态和Massive。我正在使用动态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>
            }

到目前为止的经验是我写的代码少得多。

答案 3 :(得分:0)

由于匿名类型总是注释为“内部”,因此您无法从View访问动态类型实例,因为它们位于不同的范围内。

我找到一种比使用ViewBag更好的方法。答案是Mono.Cecil。从NuGet获取方便。

使用Mono.Cecil的帮助,您可以更改从ASP.NET MVC项目生成的MSIL代码,并将类型的可访问修饰符更改为“public”。

我写了一个小程序,并在GitHub上托管。

您可以从命令行调用程序或在ASP.NET MVC项目的构建事件中添加构建后事件:

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

注意:“DynamicHelper”是代码的项目名称,您可以根据具体情况进行更改。