Начните с разработки модели вида:
public class ProductLineViewModel
{
public string Description { get; set; }
public int Quantity { get; set; }
}
, затем в вашем контроллере используйте эту модель вида:
ViewBag.rawMaterialRequired =
from x in db.RawMaterial
join y in db.ProductFormulation on x.ID equals y.RawMaterialID
where y.ProductID == p
select new ProductLineViewModel
{
Description = x.Description,
Quantity = y.Quantity
};
и внутри вида:
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
@foreach(var product in (IEnumerable<ProductLineViewModel>)ViewBag.rawMaterialRequired)
{
<tr>
<td>@product.Description</td>
<td>@product.Quantity</td>
</tr>
}
</tbody>
</table>
Это был первый шаг к улучшению вашего кода.Второй шаг состоит в том, чтобы избавиться от ViewBag
и использовать строго типизированные представления и шаблоны отображения:
public ActionResult Foo()
{
var model =
from x in db.RawMaterial
join y in db.ProductFormulation on x.ID equals y.RawMaterialID
where y.ProductID == p
select new ProductLineViewModel
{
Description = x.Description,
Quantity = y.Quantity
};
return View(model);
}
и в представлении удалить все некрасивые циклы благодаря шаблонам отображения:
@model IEnumerable<ProductLineViewModel>
<table>
<thead>
<tr>
<th>Description</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
@Html.DisplayForModel()
</tbody>
</table>
и внутри шаблона дисплея (~/Views/Shared/DisplayTemplates/ProductLineViewModel.cshtml
):
@model ProductLineViewModel
<tr>
<td>@Html.DisplayFor(x => x.Description)</td>
<td>@Html.DisplayFor(x => x.Quantity)</td>
</tr>