我有以下课程。
public class Header
{
public int HeaderId { get; set}
public virtual List<Detail> Details { get; set; }
....
}
public class Detail
{
[Required, ForeignKey("Header")]
public int HeaderId { get; set; }
public virtual Header Header { get; set; }
public int Quantity { get; set; }
....
}
我已经构建了一个显示Header
列表的页面。我没有使用任何ViewModel。
Index.cshtml
@model IEnumerable<App1.Models.Header>
@foreach (var i in Model) {
....
// TODO: Add Sum of Detail.Quantity for each Header item
}
现在,我要求在Quantity
页面中为每个Detail
项添加Header
的总和。
重构代码的最佳和最快方法是什么?是Index.cshtml
良好方法的扩展方法吗?
P.S。我只是以求和为例,实际计算要复杂得多。
答案 0 :(得分:0)
您应该尝试将逻辑保留在模型中而不是视图中。由于它是Header中Detail对象的聚合,我建议你将这些逻辑添加到Header对象中。
public class Header
{
public int HeaderId { get; set; }
public virtual List<Detail> Details { get; set; }
public int SumOfDetailQuantities
{
get { return Details.Sum(x => x.Quantity); }
}
}
我不建议您向Header添加扩展方法,因为您已经完全控制了Model,扩展方法只会混淆代码。在模型中使用这种类型的聚合逻辑没有任何问题,但是如果你有一些宗教原因没有这样做,那么从ViewModelBuilder设置值。
答案 1 :(得分:0)
创建一个类
public class HeaderWithSum {
public Header Header {get; set;}
public int Sum {get; set;}
}
然后在你的行动方法中:
public ActionResult Index() {
var hs as headerWithSum;
List<HeaderWithSum> headerWithSum;
List<Header> headers = headerRepository.GetAll();
int sum = 0;
foreach(var h in headers) {
sum = h.GetSumOfDetails();
hs = new HeaderWithSum()
{
Header = h , Sum = sum
};
headerWithSum.Add(hs);
}
return View(headerWithSum);
}
为简化我省略了一些代码,如DI和GetSumOfDetails方法的实现
答案 2 :(得分:0)
最后,我只需创建一个函数并将其放入ViewBag
。
ViewBag.SumFunc = new Func<Header, int>(....);
然后在视图中调用它。