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

时间:2015-04-07 22:13:36

标签: c# asp.net-mvc razor model-view-controller visual-studio-2013

我需要对从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>

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

任何逻辑类型操作都应该在Controller中完成。然后,结果应保存到View Model Controller。应在Model中使用View,以便您可以显示对数据执行的某种操作的结果。我们的想法是,Controller会更改View Model,并在适当情况下更改Entity Model

View Model中的Controller应根据您的Entity Model设置Controller's。如果您正在使用DDD,那么很多Domain Models逻辑应该位于//------------------------------------------------------------------------------ // <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> //------------------------------------------------------------------------------ 中,当然这个逻辑适合于域,例如计算

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

Q-MakModel.Context.tt

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

然后在View Model地图中将Entity Model映射到View并进行保存。当您加载MVC时,由于Controller Entity Model首先加载,因此您将View Model映射到Entity并将其返回到视图。

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

View我只会提供与{{1}}相关的内容。

我已将此添加到答案中,因为上面的评论太长了。

让我知道你是如何上场的,这肯定是EF删除了这2个属性。