所以我有一个名为Item的父类:
public class Item {
public Guid Id {get; set;}
public double Price {get; set;}
}
The Bread and Cookie类继承自该类:
public class Bread : Item {
public string Type {get; set;}
}
public class Cookie : Item {
public string Flavour {get; set;}
public string Size {get; set;}
}
我使用“ AddToCart”按钮在Razor视图上的表中显示这些。
@using Data.Entities
@model ViewModels.CookieIndexViewModel
@{
ViewBag.Title = "Cookie list";
}
<h1>Our collection of cookies:</h1>
<table class="table">
@foreach (var cookie in Model.Cookies)
{
<tr>
<td>@cookie.Flavour</td>
<td>@cookie.Size</td>
<td>@cookie.Price</td>
<td><a class="btn btn-primary text-white" asp-action="AddItem" asp-controller="Cart" asp-route-item="@cookie">Purchase</a></td>
</tr>
}
</table>
并且在CartController中,我具有将Item作为参数的AddItem方法
public IActionResult AddItem(Item item)
{
return View();
}
但是这行不通,因为无法将Cookie转换为商品的任何提示?
但是这不起作用,因为无法将Cookie转换为项目有关如何执行此操作的任何提示?
这不是这里的问题。您试图将模型(复杂的类型)填充到单个参数中。这不是http查询参数的工作方式,也不是MVC模型绑定的工作方式。
执行控制器操作:
public IActionResult AddItem(Item item)
这不会尝试绑定名为item
的单个属性。它将尝试解析模型的[[properties(id
,price
)。因此,您需要单独传递这些信息。
只是项目ID
。您为什么要传递价格?那是一个安全问题。有人可能会更改请求中的价格!? <tr>
<td>@cookie.Flavour</td>
<td>@cookie.Size</td>
<td>@cookie.Price</td>
<td><a class="btn btn-primary text-white" asp-action="AddItem" asp-controller="Cart" asp-route-id="@cookie.Id">Purchase</a></td>
</tr>
public IActionResult AddItem(Guid id)
{
//lookup item
//add to cart
return View();
}