通过 javascript 将参数传递给操作不会传递整数值

Passing parameter to action via javascript does not pass an integer value

我正在开发需要将参数传递给操作的 asp.net mvc 应用程序。我正在通过 url 传递参数。 调用了操作,但参数值已损坏。例如,如果我有一个字符串“This is the example of a string passed by parameter”,当它到达动作时它就像“This is the”一样到达,即它只占一部分。

我不知道这是不是因为这个字符串是 json 格式,某些字符可能导致了这个信息中断。在分析中我注意到,当有“#”时,字符串被破坏,只有左边的内容被传递。我尝试使用 replace 将“#”替换为“$”,但这没有用。从另一端到达的字符串与 javascript.

生成的原始字符串不同

async function GravarPlayList() {
    var listaDeVideos = [];
    for (var i = 0; i < listaDeIds.length; i++) {
        var videos = await executeSearch(listaDeIds[i], maxResult);

        for (var j = 0; j < videos.length; j++) {
            listaDeVideos.push(videos[j]);
        }
    }

    var jsonVideos = JSON.stringify(listaDeVideos);

    var url = "/Playlist/CreatePlaylist?pListaIds=" + jsonVideos;
    var novaUrl = url.replace('#', '$');
    window.location.href = novaUrl;
}

[HttpGet]
public ActionResult CreatePlaylist(string pListaIds)
{
      var pcustom = pListaIds.Replace('$', '#');
      AppCache.Instance.VideoPesquisa = JsonConvert.DeserializeObject<IEnumerable<VideoItem>>(pcustom);
      PlaylistModel playlistModel = new PlaylistModel() { VideosPesquisa = AppCache.Instance.VideoPesquisa };
      return View(playlistModel);
}

参数传递的字符串示例

[
    {
        "kind":"youtube#playlistItem",
        "etag":"vINbNEDWl2kOPwB7uZNfjznpqic",
        "id":"UExCbG5LNmZFeXFSZ2daWmdZcFBNVXhkWTFDWWtadEFSUi41NkI0NEY2RDEwNTU3Q0M2",
        "snippet":{
            "publishedAt":"2018-06-24T07:24:38Z",
            "channelId":"UCQYMhOMi_Cdj1CEAU-fv80A",
            "title":"C Programming – Features & The First C Program",
            "description":"Programming & Data Structures: C Programming – Features & The First C Program\nTopics discussed:\n1. Features of C programming.\n2. High-level language Vs Low-level language.\n3. Explanation of a…vi/Wslbb1UQUSc/hqdefault.jpg",
            "width":480,
            "height":360
        },
        "standard":{
            "url":"https://i.ytimg.com/vi/Wslbb1UQUSc/sddefault.jpg",
            "width":640,
            "height":480
        },
        "maxres":{
            "url":"https://i.ytimg.com/vi/Wslbb1UQUSc/maxresdefault.jpg",
            "width":1280,
            "height":720
        }
    },
    "channelTitle":"Neso Academy",
    "playlistId":"PLBlnK6fEyqRggZZgYpPMUxdY1CYkZtARR",
    "position":168,
    "resourceId":{
        "kind":"youtube#video",
        "videoId":"Wslbb1UQUSc"
    },
    "videoOwnerChannelTitle":"Neso Academy",
    "videoOwnerChannelId":"UCQYMhOMi_Cdj1CEAU-fv80A"
}
}
]

到达行动时的字符串

[{"kind":"youtube"

我该如何解决这个问题?我不想使用 ajax,因为我需要重定向到另一个页面。

你有一些不对劲的地方:

  • 通常,JSON 通过请求正文而不是查询参数发送。
  • 你的 JSON 似乎有点语法错误。
  • 你的 API 端点是 GET 而它应该(可能?)是 POST,看到你的控制器方法名称是 CreatePlaylist

ASP.NET 可以将请求主体绑定到 class 对象。您应该创建一个 class 对象来表示请求 JSON - 在线转换器可以使这更容易,例如 this one。假设我正确地纠正了 JSON 中的错误,它会产生以下 classes:

public class Snippet
{
    public DateTime publishedAt { get; set; }
    public string channelId { get; set; }
    public string title { get; set; }
    public string description { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class Standard
{
    public string url { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class Maxres
{
    public string url { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class ResourceId
{
    public string kind { get; set; }
    public string videoId { get; set; }
}

public class Video
{
    public string kind { get; set; }
    public string etag { get; set; }
    public string id { get; set; }
    public Snippet snippet { get; set; }
    public Standard standard { get; set; }
    public Maxres maxres { get; set; }
    public string channelTitle { get; set; }
    public string playlistId { get; set; }
    public int position { get; set; }
    public ResourceId resourceId { get; set; }
    public string videoOwnerChannelTitle { get; set; }
    public string videoOwnerChannelId { get; set; }
}

然后您可以将控制器方法更改为:

[HttpPost]
public ActionResult CreatePlaylist(Video pListaIds)
{
      var pcustom = pListaIds.Replace('$', '#');
      AppCache.Instance.VideoPesquisa = JsonConvert.DeserializeObject<IEnumerable<VideoItem>>(pcustom);
      PlaylistModel playlistModel = new PlaylistModel() { VideosPesquisa = AppCache.Instance.VideoPesquisa };
      return View(playlistModel);
}

至于javascript这边,你确定不要用Ajax吗?似乎有一个相当不错的解决方案 here 您可以尝试。这将使向后端提供请求正文变得更加容易。