ASP.NET“ asp-route”标记助手多义词

问题描述 投票:0回答:1

所以我有一个名为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转换为商品的任何提示?

asp.net-mvc polymorphism tag-helpers
1个回答
0
投票

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

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

执行控制器操作:

public IActionResult AddItem(Item item)

这不会尝试绑定名为item的单个属性。它将尝试解析模型的[[properties(idprice)。因此,您需要单独传递这些信息。

我的解决方案是传递

只是项目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();
}
© www.soinside.com 2019 - 2024. All rights reserved.