通过 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 您可以尝试。这将使向后端提供请求正文变得更加容易。
我正在开发需要将参数传递给操作的 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 您可以尝试。这将使向后端提供请求正文变得更加容易。