计算字段 - 扩展方法,ViewModel,Viewbag变量?

时间:2013-06-01 03:42:25

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

我有以下课程。

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。我只是以求和为例,实际计算要复杂得多。

3 个答案:

答案 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>(....);

然后在视图中调用它。