【问题标题】:Passing objects as url parameters c#将对象作为url参数传递c#
【发布时间】:2017-01-13 18:45:32
【问题描述】:

我想将Filters 对象以及其他内容作为查询参数传递到 url,例如:

   { 
       "clientId": 2, 
       "date": "2017-01-01",
       "filters": {
            "days": { "monday", "tuesday", "wednesday" },
            "months": { "january", "february" }
   }

但我不知道这个例子中像filters 这样的对象是如何通过查询字符串参数传入的。我知道你通常会有这样的东西:

https://localhost/path?clientId=2&date=2017-01-01&filters= ?????

谢谢!

【问题讨论】:

  • 如果您无法 POST 数据,那么您可以将该 JSON 字符串编码为 base64 并将其作为一个参数传递,然后在服务器上进行解码和反序列化。
  • 在不知道服务器如何期望对象的情况下很难判断。服务器是你控制的吗?
  • 服务器由我控制,是的,然后可能有一个 POST ......但我也不确定如何做到这一点

标签: c# object url parameters


【解决方案1】:

如果您的数据很复杂,而不是作为查询字符串参数发送,也许更好地发布您的数据。但无论如何,如果您想作为查询字符串发送,您可以执行以下操作:

  1. 将对象转换为字符串
  2. 编码字符串
  3. 作为参数附加

对于以下对象(转换为字符串并删除空格):

{
   "clientId": 2,
   "date": "2017-01-01",
   "filters": {
   "days": { "monday", "tuesday", "wednesday" },
   "months": { "january", "february" }
}

我创建了可以通过网络安全发送的编码文本:

%7B%0A%22clientId%22%3A%202%2C%0A%22date%22%3A%20%222017-01-01%22%2C%0A%22filters%22%3A%20%7B%0A%22days%22%3A%20%7B%20%22monday%22%2C%20%22tuesday%22%2C%20%22wednesday%22%20%7D%2C%0A%22months%22%3A%20%7B%20%22january%22%2C%20%22february%22%20%7D%0A%7D

你的情况是:

https://localhost/path?clientId=2&date=2017-01-01&filters=%7B%0A%22clientId%22%3A%202%2C%0A%22date%22%3A%20%222017-01-01%22%2C%0A%22filters%22%3A%20%7B%0A%22days%22%3A%20%7B%20%22monday%22%2C%20%22tuesday%22%2C%20%22wednesday%22%20%7D%2C%0A%22months%22%3A%20%7B%20%22january%22%2C%20%22february%22%20%7D%0A%7D

您可以使用meyerweb.com 来测试编码/解码,但在C# 中您可以研究HttpUtility.UrlEncode() 方法,该方法也可以在您的情况下使用。

【讨论】:

  • 出于好奇,如果这样更好的话,如何使用这些数据进行 POST?
  • @keens12 我假设您想从 UI 发布到服务器端的操作。您可以使用 AJAX 发出 POST 请求。我在这里解释了一些很好的例子:stackoverflow.com/questions/4120212/… 当您使用 post 发送数据时,它们会被放入“body”中。
  • 帖子不是用来对数据库进行更改的吗?而 get 只是用来检索一些东西?在这种情况下,帖子如何更好?
  • @Chucky 这是真的。但是如果你想发送有效载荷怎么办?如何使用 GET 做到这一点?
【解决方案2】:

如果你真的想在查询字符串中传递参数,这是一个使用 ASP.NET MVC 的示例。

创建路线: routes.MapRoute( name: "Custom", url: "{controller}/{action}/{clientId}/{date}/{filtersDay}/{filtersMonth}", defaults: new { controller = "Home", action = "CustomQueryString" } );

您可以重复一个项目,模型绑定将创建一个字符串数组: @987654321@

然后,您将拥有:

【讨论】:

    【解决方案3】:

    我有一个 ToDictionary 扩展方法,它将对象转换为查询字符串,您可以通过 RouteValues 传递它,我通过 Model.SearchCriteria,这是以下示例中的复杂对象:

    <a href='@Url.Action("ExportAll", 
        new RouteValueDictionary(Model.SearchCriteria))'>Export All</a>
    

    ToDictionary 是一个扩展方法:

    public static class ToDictionaryExtensionMethod
    {
        public static IDictionary<string, object> ToDictionary(this object source)
        {
            return source.ToDictionary<object>();
        }
    }
    

    很遗憾,以下代码不起作用:

    @Html.ActionLink("Export All", "ExportAll", 
          new RouteValueDictionary(Model.SearchCriteria.ToDictionary()), 
          new { @class = "btn btn-default" })
    

    这是因为此版本的 ActionLink 接受路由值作为对象,而不是作为 RouteValueDictionary(在 MVC 5 中)。因此,为了使其工作,我必须将 Html 属性转换为字典,并使用正确的 Html.ActionLink 重载:

    @Html.ActionLink("Export All", "ExportAll", 
          new RouteValueDictionary(Model.SearchCriteria.ToDictionary()), 
          new Dictionary<string,object>{{"class","btn btn-default"}})
    

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多