【问题标题】:How do I output Massive ORM dynamic query to an MVC 3 View?如何将 Massive ORM 动态查询输出到 MVC 3 视图?
【发布时间】:2011-10-06 21:44:41
【问题描述】:

当我使用 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 语法访问我的“Thing”对象的属性。

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

关于如何将 Massive.DynamicModel.Query 对象转换为类型化对象的任何一般想法?

【问题讨论】:

    标签: asp.net-mvc-3 massive


    【解决方案1】:

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

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

    【讨论】:

    • 我想如果这家伙愿意接受这样的建议,他一开始就不会使用 Massive!他会使用 Dapper 或 PetaPoco。
    • 我并不完全反对创建视图模型,但我有兴趣弄清楚这些 C# 动态是如何工作的。我很欣赏他们在非 C# 语言中的表现。但是,我有点卡在转换过程(查询对象到视图模型或适合视图的东西),但是当我将源代码阅读到 Massive 时,我得到了它。
    • Mohamed:我看过 Dapper,但没有看过 PetaPoco。您在这里的评论非常有帮助。 PetaPoco 可能正是我想要的。
    【解决方案2】:

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

    您最好观看制作,因为它更多地是关于 Rob 固执己见的开发方式,而不是关于 MVC 3,并且描述了使用 Massive 和其他 Rob 工具。

    但即使您不确保查看此处的代码示例以进行生产(免费),也可以了解他如何将 Massive 集成到 MVC 3:

    https://github.com/tekpub/mvc3

    你可以看到他的生产控制器长什么样。很有趣的方式。

    【讨论】:

    • 关于 ViewBag 的要点。我会试试的。这是一个有趣的截屏视频。我很欣赏它从稍微不同的角度看待 MVC 3。谢谢。
    【解决方案3】:

    我现在正在尝试动态和 Massive。我正在使用动态视图模型:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      我编写了一个小控制台程序并将其托管在GitHub

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        相关资源
        最近更新 更多