0

我有以下课程。

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。

索引.cshtml

@model IEnumerable<App1.Models.Header>
@foreach (var i in Model) {
    ....
    // TODO: Add Sum of Detail.Quantity for each Header item
}

现在,我需要为页面中的每个项目添加类Quantity中的总和。DetailHeaderIndex.cshtml

重构代码的最佳和最快的方法是什么?Header是一种好的方法的扩展方法吗?

PS我只是以求和为例,实际计算要复杂得多。

4

3 回答 3

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 中设置值。

于 2013-06-01T04:10:41.903 回答
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 方法的实现

于 2013-06-01T05:11:11.500 回答
0

最后我只是创建一个函数并将其放入ViewBag.

ViewBag.SumFunc = new Func<Header, int>(....);

然后在视图中调用它。

于 2013-06-01T20:48:57.663 回答