C# ASP.NET核心MVC路由:尝试在ASP所有路由数据中传递字典

C# ASP.NET核心MVC路由:尝试在ASP所有路由数据中传递字典,c#,asp.net,dictionary,asp.net-core,.net-core,C#,Asp.net,Dictionary,Asp.net Core,.net Core,所以我有一个物体,我正试图通过另一条路线 在my index.cshtml中,我正在创建要发送的dictionary对象: @{ var data = new Dictionary<string , ProductToCart> { {"item", Model }

所以我有一个物体,我正试图通过另一条路线

在my index.cshtml中,我正在创建要发送的dictionary对象:

                    @{
                        var data = new Dictionary<string , ProductToCart>
                        {
                            {"item",  Model }
                         };
                    }
@{
var数据=新字典
{
{“项目”,模型}
};
}
我还将链接标记(在此视图中)与asp all route数据一起传递给我的字典,如下所示:

  <a asp-controller="Cart" asp-action="AddToCart" asp-route="productData" asp-all-route-data="data" class="btn btn-lg btn-outline-primary text-uppercase"> <i class="fas fa-shopping-cart"></i> Add to cart </a>
添加到购物车
我收到以下错误:

                    @{
                        var data = new Dictionary<string , ProductToCart>
                        {
                            {"item",  Model }
                         };
                    }
错误CS0266无法隐式转换类型 “System.Collections.Generic.Dictionary”到 'System.Collections.Generic.IDictionary'。明确的 存在转换(您是否缺少演员阵容?)


Q:如何转换此字典,以及在ASP.NET CORE MVC中通过路由传递字典/复杂对象的正确方法?

它不以默认方式处理复杂类型。 您应该创建自己的自定义标记帮助器

这可能有助于您进一步了解标记帮助器以及如何创建自己的自定义标记帮助器

无法将类型“System.Collections.Generic.Dictionary”隐式转换为“System.Collections.Generic.IDictionary”

如果选中,您会发现
RouteValues
定义为
IDictionary
,如下所示

/// <summary>
/// Additional parameters for the route.
/// </summary>
[HtmlAttributeName(RouteValuesDictionaryName, DictionaryAttributePrefix = RouteValuesPrefix)]
public IDictionary<string, string> RouteValues
{
    get
    {
        if (_routeValues == null)
        {
            _routeValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
        }

        return _routeValues;
    }
    set
    {
        _routeValues = value;
    }
}
//
///路线的其他参数。
/// 
[HtmlAttributeName(RouteValuesDictionaryName,DictionaryAttributePrefix=RouteValuesPrefix)]
公共索引路由值
{
得到
{
如果(_routeValues==null)
{
_routeValues=新字典(StringComparer.OrdinalIgnoreCase);
}
返回路径值;
}
设置
{
_routeValues=值;
}
}
如果您想通过路由传递复杂对象,可以尝试将其序列化为json字符串

@{

    var data = new Dictionary<string, string>();

    data.Add("item", ((Microsoft.AspNetCore.Html.HtmlString)Json.Serialize(Model)).Value);
}

<a asp-route="productData" asp-all-route-data="data"  class="btn btn-lg btn-outline-primary text-uppercase"> <i class="fas fa-shopping-cart"></i> Add to cart </a>
@{
var data=newdictionary();
data.Add(“item”,((Microsoft.AspNetCore.Html.HtmlString)Json.Serialize(Model)).Value);
}
添加到购物车
请注意,如果对象太复杂,它可能会超过查询字符串的最大长度限制


此外,正如@DA提到的,实现需求的另一种方法是实现定制的AnchorTagHelper。

Hi@Shaz,关于这个案例有什么更新吗?您是否使用我们共享的解决方案解决了问题?