C# 在MVC中应该在哪里进行计算?
我需要对从SQL server提取的数据执行一些转换计算。看起来最好的地方是在我浏览收藏时的视图中,但我不确定这是否是最佳实践。此外,我不知道如何在视图中进行操作。 我对这一点还比较陌生,而且正在慢慢地学习,所以我甚至不确定要完成我要做的事情的语法 一如既往,我们非常感谢您的帮助C# 在MVC中应该在哪里进行计算?,c#,asp.net-mvc,razor,model-view-controller,visual-studio-2013,C#,Asp.net Mvc,Razor,Model View Controller,Visual Studio 2013,我需要对从SQL server提取的数据执行一些转换计算。看起来最好的地方是在我浏览收藏时的视图中,但我不确定这是否是最佳实践。此外,我不知道如何在视图中进行操作。 我对这一点还比较陌生,而且正在慢慢地学习,所以我甚至不确定要完成我要做的事情的语法 一如既往,我们非常感谢您的帮助 <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> @foreach (v
<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>
@foreach(模型中的var项或_OP)
{
@Html.Raw(“item.NAME)@Html.Raw(“\”>”)
@Html.Raw(“”)
开始
停止
@Html.Raw(“”)
@Html.Raw(“item.NAME)@Html.Raw(\”class=\”panel collapse\”role=\“tabpanel\”aria labelledby=\“heading”)@Html.DisplayFor(modelitem=>item.NAME)@Html.Raw(\”>)
@DisplayFor(modeleItem=>item.PWPLACE)
@DisplayFor(modelitem=>item.ppart)
@数学(item.PTE.Value/60)item.PTE)
@DisplayFor(modeleItem=>item.PTR)
@Html.Raw(“”)
}
在这种情况下,您可以在模型中进行计算。我建议您在模型
类中添加一个属性,例如:
public PropertyName
{
get
{
return @Math(this.PTE.Value/60);
}
}
任何逻辑类型的操作都应该在控制器中执行。然后,应通过控制器将结果保存到视图模型
。应该在视图中使用模型
,以便显示对数据执行的某种操作的结果。其思想是控制器
更改视图模型
,如果合适,更改实体模型
如果您有实体模型,则应根据您的实体模型设置控制器中的视图模型
。如果您使用的是DDD,那么许多控制器的
逻辑应该位于域模型
中,这当然是适用于域的逻辑,例如计算
看起来您正在使用实体框架。如果您在顶部链接的页面上阅读:
//------------------------------------------------------------------------------
// <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
文件生成的。确保上下文
文件包含这两个属性,因为每次EF重新生成模型时,如果模板中不存在这些属性,它将删除它们。另一个要考虑的问题是,我不会在<代码> UI <代码>代码> >视图< /代码>中使用<代码>实体模型<代码>。我会使用自定义的视图模型
然后在控制器中
将视图模型
映射到实体模型
,并进行保存。加载视图
时,由于MVC
的原因,控制器
首先加载,因此将实体模型
映射到视图模型
,并将其返回到视图
这将保护您的实体
,因此您不会在数据库中保存垃圾
在视图模型中
我只会放置与该视图相关的内容
我在回答中加入了这一点,只是因为上面的评论太长了
让我知道你的进展如何,删除这两个属性肯定是很困难的。视图用于呈现HTML,而不是执行计算。另外,在打印Html时,请不要使用@Html.Raw()
。MVC中视图的一个良好做法是向其提供所有需要的信息,以便视图仅呈现数据。此数据对象通常称为ViewModel。我在没有@Html.Raw()的情况下尝试过它,但格式不正确。离题:不要使用此类结构:@Html.Raw(“你能给我一个正确语法的示例吗?每次我尝试不使用@Html.Raw())
我的页面呈现不正确。我需要将item.Name
中的数据附加到折叠id中。我需要这个id=“collapse5”我一直得到这个id=“collapse5”,但没有“@Html.Raw()”,所以我尝试了这个,但一直得到一个错误。公共可为null的PTE{get{return Math(this.PTE Value/60);}set{}
Error表示Math是一种类型,但与变量类似。您不需要添加@Math()
,只需执行计算并返回结果。如果PTE是一个十进制数?/Nullable
,则需要执行this.PTE.GetValueOrDefault()/60
@Clint Clark-改为尝试此操作,public decimal PropertyName{get{返回this.PTE.Value/60;}}
@ShaneVanWyk-我已经将这些属性添加到了我的模型中,非常有效,谢谢。现在的问题是,只要编译器重新构建数据模型,我就会丢失我添加的任何属性。有什么办法吗?仅供参考,我正在处理一个我无法更改的数据方案,而且布局不太好。@ClintMark-我有点不确定习惯这里发生的事情抱歉。需要更多详细信息。您是说编译器删除了您添加的代码。还是这是一个持久性问题?还是UI中的显示问题?请记住,您需要添加@Html.DisplayFor(modelitem=>item.PropertyName).chtml
文件中的
。请澄清这是否是问题所在。我花了上周的时间试图更好地了解实体模型
和视图模型
的自动映射和最佳实践。我认为这是一部分