0

Razor 中是否有一种方法可以在页面上打印一些 HTML,而稍后在视图中知道该值?

例如:我想打印一个昂贵计算的总和,并且该总和应该在 HTML 中的项目之前。但是对于下面的示例,它总是会打印 0。我只想计算总和一次。

我想在视图中解决这个问题,而不是在 csharp 助手或客户端(css、javascript 等)

@{
  var sum = 0;
}

<table>
@* I would like to print here the sum which is known after the foreach loop*@
 <tr><td>total: @sum</td></tr>

    @foreach (var item in items)
    {
      <tr>
        @{ 
          var x= item.expensiveCalculation(); 
          sum+= x;
        }
        //print item with x
        <td>@x</td>

      </tr>
    }

</table>

编辑:非常重要的是,昂贵的计算()每个项目只计算一次!

4

1 回答 1

4

您的模型不适合视图的要求。句号。

因此,当您的模型不适应您的视图的要求时,您继续定义一个视图模型,以便所有昂贵的操作都在控制器内完成。

所以:

public class ItemViewModel
{
    public decimal Price { get; set; }
    public string Name { get; set; }
}

现在您的视图变成了视图模型的强类型,并且不再有昂贵的操作:

@model IEnumerable<ItemViewModel>
<table>
    <tr>
        <td>
            total: @Model.Sum(item => item.Price)
        </td>
  </tr>
  @foreach (var item in Model)
  {
      <tr>
          <td>@item.Name - @item.Price<td>
      </tr>
  }
</table>

现在在您的控制器操作中准备此视图模型并将其传递给视图:

public class SomeAction()
{
    IEnumerable<Item> items = ... go and fetch your domain models from wherever you are fetching them
    // now let's build the view model
    var model = new MyViewModel
    {
        Items = items.Select(x => new ItemViewModel
        {
            Name = x.Name,
            Price = x.expensiveCalculation()
        })
    };

    // and we are obviously passing the view model to the view, not the domain model
    return View(model);
}

如您所见,我们在控制器中为每个元素执行昂贵的操作,以便将其绑定到视图模型的相应属性Price(视图模型预先计算的属性。

下次当你在 ASP.NET MVC 中遇到问题时,不要忘记视图模型是解决问题的方法。

于 2012-09-20T12:00:29.033 回答