MVC中应该在哪里进行计算?

Where should calculations be done in MVC?

我需要对从 SQL 服务器中提取的数据执行一些转换计算。看起来最好的地方是在我循环浏览集合时在视图中,但我不确定这是否是最佳实践。另外,我不确定如何在视图中进行操作。 我对此还比较陌生,并且在慢慢学习,所以我什至不确定完成我正在尝试做的事情的语法。

一如既往,我们非常感谢您的帮助。

   <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">

    @foreach (var item in Model.OR_OP)
    {
        <div class="panel panel-default">
            @Html.Raw("<div class=\"panel-heading\" role=\"tab\" id=\"heading")@Html.DisplayFor(modelitem => item.NAME)@Html.Raw("\">")
            <h4 class="panel-title">
                @Html.Raw("<a data-toggle=\"collapse\" data-parent=\"#accordion\" href=\"#collapse")@Html.DisplayFor(modelitem => item.NAME)@Html.Raw("\" aria-expanded=\"true\" aria-controls=\"collapse")@Html.DisplayFor(modelitem => item.NAME)@Html.Raw("\">")

                @Html.DisplayFor(modelitem => item.NAME)

                -
                @Html.DisplayFor(modelitem => item.DESCR)

                @Html.Raw("</a>")

            </h4>

            <div>
                <div class="btn-custom-start">Start</div>
            </div>
            <div>
                <div class="btn-custom-stop">Stop</div>
            </div>


            @Html.Raw("</div>")
            @Html.Raw("<div id=\"collapse")@Html.DisplayFor(modelitem => item.NAME)@Html.Raw("\" class=\"panel-collapse collapse collapse\" role=\"tabpanel\" aria-labelledby=\"heading")@Html.DisplayFor(modelitem => item.NAME)@Html.Raw("\">")
            <div class="panel-body">
                @Html.DisplayFor(modelitem => item.PWPLACE)
                @Html.DisplayFor(modelitem => item.PPARTS)
                @Math(item.PTE.Value/60) <------ this is where I would like to do the calculation.
                @Html.DisplayFor(modelitem => item.PTE)
                @Html.DisplayFor(modelitem => item.PTR)

            </div>
            @Html.Raw("</div> ")
        </div>

    }

</div>

在这种情况下,您可以在 Model 中进行计算。我建议您在 Model class 中添加一个 属性,例如:

public PropertyName
{
    get
    {                
        return @Math(this.PTE.Value/60);
    }
}

任何逻辑类型的操作都应该真正在Controller中完成。然后结果应该被Controller保存到View ModelModel 应该用在 View 中,这样您就可以显示对数据执行的某种操作的结果。这个想法是 Controller 改变了 View Model 并且如果合适 Entity Model.

Controller 中的 View Model 应根据您的 Entity Model 进行设置(如果您有的话)。如果您使用的是 DDD,那么很多 Controller's 逻辑应该位于 Domain Models 中,这些逻辑当然适用于领域,例如计算。

看来您正在使用 Entity Framework。如果您在顶部链接的页面上阅读:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

我认为您的模型是从 Q-MakModel.Context.tt 文件生成的。确保 Context 文件包含这两个属性,因为每次 EF 重新生成模型时,如果模板中不存在这些属性,它就会删除它们。另一件需要考虑的事情是,我不会在 UI View 中使用 Entity Model。我会使用自定义 View Model

然后在 Controller 中将 View Model 映射到 Entity Model 并进行保存。当您加载 View 时,由于 MVC 首先加载 Controller,因此您将 Entity Model 映射到 View Model,将 return 映射到查看。

这将保护您的 Entity,因此您不会在数据库中保存垃圾。

View Model 中,我只会放与 View 相关的内容。

我把这个添加到一个答案中只是因为上面的评论太长了。

告诉我你的进展情况,绝对是 EF 删除了这 2 个属性。