【问题标题】:Passing parameter to action via javascript does not pass an integer value通过javascript将参数传递给动作不会传递整数值
【发布时间】:2021-11-18 04:15:08
【问题描述】:

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

我不知道这是不是因为这个字符串是 json 格式的,并且某些字符可能会导致这个信息中断。在分析中,我注意到当有一个“#”时,字符串被破坏,只有左边的内容被传递。我尝试使用替换将“#”替换为“$”,但这不起作用。从另一端到达的字符串与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,因为我需要重定向到另一个页面。

【问题讨论】:

    标签: javascript c# asp.net-mvc-5


    【解决方案1】:

    你有一些事情是关闭的:

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

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

    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,您可以尝试。这将使向您的后端提供请求正文变得更加容易。

    【讨论】:

    • 请注意,您不再需要进行字符串替换或额外的反序列化。您可以简单地将模型的 VideosPesquisa 设置为包含 pListaIds 的新列表,假设 VideosPesquisa 的类型为 List&lt;Video&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多