2015-05-14 47 views
1

如何在视图中相乘?或者有最佳实践?项目 - 汽车租赁。 我的控制器需要参数int numberDays。 我需要计算View上所有日子的总价格。需要在一天内将价格乘以天数。然后这个参数必须以控制器的形式传递。如何在视图中相乘

public ActionResult DayView(int numberDays) 
{ 
     // 
} 

鉴于我的foreach显示numbercar,colorcar等...

@model IEnumerable<Car> 
foreach (Car car in Model) 
{ 
    //other parameters 
    <p>Full Price</p>:Model.CostOneDay  //need multiply numberDays 
} 

这个参数hiddenfor如何<p>Full Price</p>:@(car.CostOneDay * Model.NumberOfDays)增加,我需要通过这个形式给控制器

+1

你可以定义一个自定义的类,而不是你的模型是IEnumerable 有额外的属性。此时,您只需访问该属性。 –

+0

是的,@EricHotinger说。新的类将是一个[ViewModel](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc) – Liam

+0

你可以使用[calculated property](http://stackoverflow.com/questions/2030636/c-sharp-read-only-calculated-properties-should-they-be-methods),但我发现这些只会导致更多的问题,而不是他们长期解决的问题。把你的控制器计算成虚拟机 – Liam

回答

1

您可以创建一个包含CarsNumberOfDays财产

public class MyViewModel 
{ 
    public IEnumerable<Car> Cars { get; set; } 
    public int NumberOfDays { get; set; } 
} 

然后用它在你的控制器,并把它传递给视图

public ActionResult DayView(int numberDays) 
{ 
    MyViewModel model = new MyViewModel(); 
    model.NumberOfDays = numberDays; 
    model.Cars = ...; // get the car records here 

    return View(model); 
} 

,改变你的看法如下

视图模型类
@model MyViewModel 
foreach (Car car in Model.Cars) 
{ 
    //other parameters 
    <p>Full Price</p>:@(car.CostOneDay * Model.NumberOfDays) 
} 

编辑

如果您想使用@Html.HiddenFor中的乘数价格,那么您需要为您的Car类添加一个附加属性。假设CostOneDay类型是小数,添加FullPrice属性与小数类型

public class Car 
{ 
    // other properties 

    public decimal FullPrice { get; set; } 
} 

然后在控制器

public ActionResult DayView(int numberDays) 
{ 
    MyViewModel model = new MyViewModel(); 
    model.NumberOfDays = numberDays; 
    model.Cars = ...; // get the car records here 

    foreach (var car in model.Cars) 
    { 
     car.FullPrice = car.CostOneDay * model.NumberOfDays; 
    } 

    return View(model); 
} 

设置FullPrice属性为每个汽车记录,并使用@Html.HiddenFor像下面

@model MyViewModel 
foreach (Car car in Model.Cars) 
{ 
    //other parameters 
    <p>Full Price</p>:@car.FullPrice 
    @Html.HiddenFor(m => car.FullPrice) 
} 
+0

太棒了!谢谢!以及现在如何在hiddenFor中添加@(car.CostOneDay * Model.NumberOfDays)?我需要通过控制器的这种形式 – andrey1567

+0

看到我更新的答案。 – ekad

1

为了扩大我发布的评论,现在你的控制器看起来像这样:

public ActionResult DayView(int numberDays) 
{ 
    // returns View with IEnumerable 
} 

你想改变这个是这样的,利用一个新的类,CalculatedDayViewModel(命名这个更好) - 并让该类将计算的字段作为属性。一定要设置一个构造函数,允许您传入numberDays并进行计算。

public ActionResult DayView(int numberDays) 
{ 
    return View(new CalculatedDayViewModel(numberDays)); 
} 

然后在你的剃须刀,改变@model IEnumerable<Car>@model CalculatedDayViewModel,你将有机会获得的计算性能。