ASP.NET "asp-route" Tag Helper 多态性

ASP.NET "asp-route" Tag Helper polymorfisme

所以我有一个父 class 叫做项目:

public class Item {
    public Guid Id {get; set;}
    public double Price {get; set;}
}

面包和饼干 class 继承自此 class:

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 视图的 table 中显示这些。

@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 中,我有方法 AddItem 将项目作为参数

public IActionResult AddItem(Item item)
{
    return View();
}

但这不起作用,因为无法将 Cookie 转换为 Item 关于如何执行此操作的任何提示?

But this doesn't work because Cookie can not be converted to an Item any tips on how to do this?

这不是这里的问题。您要做的是将模型(复杂类型)填充到单个参数中。这不是 http 查询参数的工作方式,也不是 MVC 模型绑定的工作方式。

执行控制器操作:

public IActionResult AddItem(Item item)

这不会尝试绑定一个名为 item 的 属性。它将尝试解析模型的 属性 (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();
}