我如何输出大量ORM动态查询到MVC 3视图



当我使用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);
}

在视图中,我尝试了@model dynamic和@model Massive.DynamicModel。查询,但都不允许我使用普通的@Model访问我的"Thing"对象的属性。名称的语法。

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

关于如何将Massive.DynamicModel.Query对象转换为类型化对象,有什么一般的想法吗?

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

如果不遵循这一基本规则,你的ASP就会失败。. NET MVC体验可能很快就会变成一场噩梦。

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

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

但是,即使你没有确保检查这里的代码样本的生产(免费),看看他是如何集成到MVC 3:

https://github.com/tekpub/mvc3

你可以看到他的生产控制器是什么样的。非常有趣的方法

我现在正在尝试动态和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);
    }

在我看来,第一行没有对任何强类型的引用,例如NOT THIS:

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

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

因为匿名类型总是被注释为"内部",所以你不能从View访问你的动态类型实例,因为它们在不同的作用域。

我发现一个更好的方法,使其工作比使用ViewBag。答案是莫诺,塞西尔。从NuGet中获取。

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

我写了一个小的控制台程序,并把它放在GitHub上。

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

"$(SolutionDir)DynamicHelperbinDebugDynamicHelper.exe" "$(TargetPath)"

注意:"DynamicHelper"是代码的项目名称,你可以根据你的情况改变它

最新更新