1

我按照这个例子:

ASP.NET MVC - 将数组对象作为 Html.ActionLink(...) 中的路由值传递

但是,我的 Action 总是用null. 我究竟做错了什么?

foreach (OrderDetail od in order.OrderDetails)
{
   rvd.Add("key" + count++, productID);
   rvd.Add("key" + count++, productName);
}

@Html.ActionLink(linkText, "Renew", "Orders", rvd, new Dictionary<string, object>())

查询字符串已正确生成,例如?key0=dog&key1=cat&key2=fish...,但我在下面的操作中得到一个空参数:

public ActionResult Renew(RouteValueDictionary rvd)
{
   // 'rvd' is null here!
}

请注意:我事先不知道参数的数量。

4

2 回答 2

4

查询字符串已正确生成,例如 ?key0=dog&key1=cat&key2=fish...

不,这不是正确的网址。正确的 url 应该是这样的:

?%5B0%5D.Key=123&%5B0%5D.Value=dog&%5B1%5D.Key=456&%5B1%5D.Value=cat...

这将映射到:

public ActionResult Renew(Dictionary<int, string> rvd)
{
    ...
}

您可以编写自定义 ActionLink 来生成此 url:

public static class LinkExtensions
{
    public static IHtmlString MyActionLink(
        this HtmlHelper html,
        string linkText,
        string actionName,
        string controllerName,
        IDictionary<string, string> parameters
    )
    {
        var a = new TagBuilder("a");
        var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
        var query = string.Join("&", parameters.Select((x, i) => string.Format("[{0}].Key={1}&[{0}].Value={2}", i, urlHelper.Encode(x.Key), urlHelper.Encode(x.Value))));
        var url = string.Format(
            "{0}?{1}",
            urlHelper.Action(actionName, controllerName, null, html.ViewContext.HttpContext.Request.Url.Scheme),
            query
        );
        a.Attributes["href"] = url;
        a.SetInnerText(linkText);
        return new HtmlString(a.ToString());
    }
}

您可以在视图中这样使用它:

@Html.MyActionLink(
    linkText, 
    "Renew", 
    "Orders", 
    order.OrderDetails.ToDictionary(x => x.ProductID.ToString(), x => x.ProductName)
)

您可以在this blog post.

于 2013-08-27T15:37:37.660 回答
1

我想正在发生的事情是您期望模型绑定器将您的数组绑定到 RouteValueDictionary,但模型绑定器不知道 key0=dog&key1=cat&key2=fish 应该是一个字典。我建议更改您的代码以接受字符串数组。为此,您的查询字符串需要如下所示:?rvd=dog&rvd=cat&rvd=fish

而你的行动...

public ActionResult Renew(string[] rvd)
{
   // 'rvd' is no longer null here!
}

重要的部分是rvd您的操作中的参数名称,以及查询字符串中每个元素的名称:?rvd=狗& rvd=猫& rvd=鱼。如果您真的想使用字典而不是字符串数组,那么您的查询字符串应该如下所示:?rvd[0]=dog&rvd[1]=cat&rvd[2]=fish为每个项目提供一个数组索引,但您可能必须将参数从 RouteValueDictionary 更改为Dictionary<string,string>,我不太确定更多信息在这里编辑:请参阅达林关于绑定到字典的评论,因为我相信他是正确的。

您可能必须为 Html.ActionLink 编写自己的扩展,该扩展接受一个数组(或任何OrderDetails内容)并将查询字符串创建为一个数组。看起来是一个很好的起点。

于 2013-08-27T15:36:08.713 回答