gpt4 book ai didi

javascript - Jquery Ajax 调用未命中操作方法/返回整个 HTML 页面

转载 作者:行者123 更新时间:2023-11-29 21:51:34 25 4
gpt4 key购买 nike

可以在下面找到我的问题的解决方案。

我无法让我的代码工作。我需要将 AJAX 调用发送到 Controller 中必须返回字符串的操作方法(目前)。但是当我激活 AJAX 调用时,它会返回我当前所在页面的 HTML 源代码而且它甚至没有达到所需的 Controller 操作
这是我的代码:

Ajax调用

<script>

function addtoCart()
{
amount = prompt("Hoeveel producten wilt u toevoegen aan uw winkelwagen?", 1);
//find product
var product = {
"id": '@Model.ID',
"naam": "@Model.Naam",
"afbeelding": "@Model.Afbeelding",
"beschrijving": "@Model.Beschrijving",
"prijs": "@Model.Prijs",
"aantal": amount
};
$.ajax({
url: '@Url.Action("storeProductInSession", "Product")',
type: 'POST',
data: JSON.stringify(product),
dataType: 'json', //Right now, this gives an "Unexpected Token < error". This is probably because when the method returns the entire HTML document, it won't be able to render <!doctype html> as JSON.
contentType: 'application/json; charset=utf-8',
success: function (result)
{
console.log(result);
},
error: function (jqXHR, textStatus, errorThrown)
{
console.log(product);
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
},
async: true
});

//sessionStorage.setItem('@Model.ID', JSON.stringify(product)); This is for later
}

StoreProductInSession(必须调用的方法)

 [HttpPost]
public string storeProductInSession(object product)/*, string naam, string afbeelding, string beschrijving, decimal prijs, int aantal)*/
{
return "This method is going to do session stuff, but for now it just has to return this string";

//Get the POST input from the AJAX call

//Add the input to a JSON array

//add the array to the session

//Return the array

//let javascript convert that array to the cart <li>
}

它仍然返回整个 HTML 页面,即使 object product 参数不正确,我也很高兴看到 ajax 调用实际上命中了那个方法。我认为调用和我的路由之间可能存在问题,但我不确定。这是代码:

    public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Product",
url: "Product/{id}",
defaults: new { controller = "Product", action = "Index" }
);
routes.MapRoute(
name: "Categorie",
url: "Categorie/{id}",
defaults: new { controller = "Categorie", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Welkom", action = "Index", id = UrlParameter.Optional }
);


}

如果我什至能够简单地将 ID 提供给 StoreProductInSession 操作,我就可以从那里开始工作。我将使用用户的 session ,所以我认为 GET 不够安全。

解决方案

非常感谢@Dolan 的帮助!问题出在我的路由上!

Ajax 调用

<script>

function addtoCart()
{
amount = prompt("Hoeveel producten wilt u toevoegen aan uw winkelwagen?", 1);
//find product
var product = {
"id": '@Model.ID',
"naam": "@Model.Naam",
"afbeelding": "@Model.Afbeelding",
"beschrijving": "@Model.Beschrijving",
"prijs": "@Model.Prijs",
"aantal": amount
};
$.ajax({
url: '@Url.Action("storeProductInSession", "Product")',
type: 'POST',
data: JSON.stringify(product),
dataType: 'html', //I tried entering 'json' but that gave me a 'unexpected < token' error.
contentType: 'application/json; charset=utf-8',
success: function (result)
{
console.log(result);
},
error: function (jqXHR, textStatus, errorThrown)
{
console.log(product);
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
},
async: true
});
</script>

storeProductInSession

 [HttpPost]
public string storeProductInSession(int id, string naam, string afbeelding, string beschrijving, decimal prijs, int aantal)
{
return String.Format("Product given to the ajax call: {0}, {1}, {2}, {3}, {4}, {5}", id, naam, afbeelding, beschrijving, prijs, aantal);
}

路由

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Product",
url: "Product/{id}",
defaults: new { controller = "Product", action = "Index" },
constraints: new { id = "\\d+" }
);

routes.MapRoute(
name: "ProductAction",
url: "Product/storeProductInSession",
defaults: new { controller = "Product", action = "storeProductInSession" }
);

routes.MapRoute(
name: "Categorie",
url: "Categorie/{id}",
defaults: new { controller = "Categorie", action = "Index" }
);

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Welkom", action = "Index", id = UrlParameter.Optional }
);


}

最佳答案

你应该使用 URL 助手:

url: '@Url.Action("storeProductInSession", "Product")',

有关详细信息,请参阅 here .

好的,我认为您的产品对象存在问题。它不是一个对象,而是一个字符串。产品对象周围的 ' 字符是问题所在 - JavaScript 认为它是一个字符串 - 而不是一个对象。它应该是这样的:

var product = {
"id": "@Model.ID",
"naam": "@Model.Naam",
"afbeelding": "@Model.Afbeelding",
"beschrijving": "@Model.Beschrijving",
"prijs": "@Model.Prijs",
"aantal": " + amount + "
};

参见此处:http://jsfiddle.net/donal/mo776xe0/1/

此外,如果您知道 id 将是一个整数,您可以这样做:

var product = {
"id": @Model.ID,
"naam": "@Model.Naam",
"afbeelding": "@Model.Afbeelding",
"beschrijving": "@Model.Beschrijving",
"prijs": "@Model.Prijs",
"aantal": " + amount + "
};

你能试试这个吗:

[HttpPost]
public string storeProductInSession(object product)
{
return "This method is going to do session stuff, but for now it just has to return this string";

}

查看您的路线,我可以看出问题所在。

假设 storeProductInSession 是您要查找的产品的 ID,因此转到产品 Controller 的索引操作。

我们需要的是约束。约束将告诉路由仅在 id 是数字(数字)时使用它。例如:constraints: new { id = @"\d+"}

因此,您需要将路由更改为此(您还需要 Product/storeProductInSession 操作的路由):

routes.MapRoute(
name: "Product",
url: "Product/{id}",
defaults: new { controller = "Product", action = "Index" },
constraints: new { id = "\\d+" }
);

routes.MapRoute(
name: "ProductAction",
url: "Product/storeProductInSession",
defaults: new {controller = "Product", action = "storeProductInSession"}
);

routes.MapRoute(
name: "Categorie",
url: "Categorie/{id}",
defaults: new { controller = "Categorie", action = "Index" }
);

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Welkom", action = "Index", id = UrlParameter.Optional }
);

因此,当您请求 Product/storeProductInSession 时。它将看到 storeProductInSession 不是数字,然后继续下一条路线。

下一条路线会将其指向 Product Controller 和 storeProductInSession 操作。

关于javascript - Jquery Ajax 调用未命中操作方法/返回整个 HTML 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28835271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com