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

Posted

技术标签:

【中文标题】通过javascript将参数传递给动作不会传递整数值【英文标题】:Passing parameter to action via javascript does not pass an integer value 【发布时间】: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,因为我需要重定向到另一个页面。

【问题讨论】:

【参考方案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;

以上是关于通过javascript将参数传递给动作不会传递整数值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 将参数传递给 Button 的操作

将多个参数传递给后端 API reactjs

MVC - 将整个模型作为参数传递给 JavaScript 中的 Url.Action

如何在 Flutter 中将参数传递给动作

从 JavaScript 将参数传递给 p:remoteCommand

html.actionlink 没有将参数传递给控制器​​动作