【问题标题】:Where should calculations be done in MVC?在 MVC 中应该在哪里进行计算?
【发布时间】:2015-06-12 16:23:24
【问题描述】:

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

【问题讨论】:

  • 视图用于渲染 HTML,而不是执行计算。另外,不要在打印 HTML 时使用@Html.Raw()
  • MVC 中视图的一个好的做法是向它提供所有需要的信息,以便视图只呈现数据。此数据对象通常称为 ViewModel。
  • 我在没有@Html.Raw() 的情况下尝试过,但格式不正确。
  • 离题:不要使用这样的结构:@Html.Raw("&lt;div class...。这是一个非常糟糕的做法。请改用@:&lt;text&gt;
  • 你能给我一个正确语法的例子吗?每次我尝试不使用 @Html.Raw() 时,我的页面都无法正确呈现。我需要将 item.Name 中的数据附加到折叠 ID。我需要这个 id="collapse5" 我不断得到这个 id="collapse 5 没有`@Html.Raw()'

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


【解决方案1】:

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

Controller 中的View Model 应根据您的Entity Model 进行设置(如果您有的话)。如果您使用的是 DDD,那么很多 Controller's 逻辑应该位于 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>
//------------------------------------------------------------------------------

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

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

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

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

我将其添加到答案中只是因为上面的评论太长了。

让我知道你的进展情况,绝对是 EF 删除了这两个属性。

【讨论】:

  • 上周我一直在努力更好地理解 Entity ModelsViewModels 的自动映射和最佳实践。我认为我的部分工作是处理我必须使用的数据方案。感谢你的帮助。非常感谢。
【解决方案2】:

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

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

【讨论】:

  • 所以我尝试了这个,但我不断收到错误消息。 public Nullable&lt;decimal&gt; PTE { get{ return @Math(this.PTE.Value / 60); } set{} } 错误说 Math 是一种类型,但用作变量。
  • 不需要加@Math(),直接计算返回结果即可。如果 PTE 是decimal? / Nullable&lt;decimal&gt;,那么你需要做this.PTE.GetValueOrDefault() / 60
  • @Clint Clark - 试试这个,public decimal PropertyName { get { return this.PTE.Value / 60; } }
  • @ShaneVanWyk - 我已将这些属性添加到我的模型中,效果很好,谢谢。现在的问题是,只要编译器重建数据模型,我就会丢失我添加的任何属性。有什么办法吗?仅供参考,我正在处理一个我无法更改的数据方案,并且布局不太好。
  • @ClintClark - 我对这里发生的事情有点困惑抱歉。需要更多细节。您是说编译器会删除您添加的代码。或者这是一个持久性问题?还是 UI 中的显示问题?请记住,您需要在.chtml 文件中添加@Html.DisplayFor(modelitem =&gt; item.PropertyName )。请澄清这是否不是问题。
猜你喜欢
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2021-03-02
相关资源
最近更新 更多