通过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<Video>
。以上是关于通过javascript将参数传递给动作不会传递整数值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SwiftUI 将参数传递给 Button 的操作
MVC - 将整个模型作为参数传递给 JavaScript 中的 Url.Action