Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用服务器方法而不使用razor页面重新加载页面_C#_Html_Asp.net Core_Razor Pages - Fatal编程技术网

C# 调用服务器方法而不使用razor页面重新加载页面

C# 调用服务器方法而不使用razor页面重新加载页面,c#,html,asp.net-core,razor-pages,C#,Html,Asp.net Core,Razor Pages,在我的.NETCoreRazor页面项目中,我希望在不重新加载页面的情况下从cshtml输入调用服务器端方法。我还是一个有剃须刀页面的新手 .cshtml : input type="submit" id="AddCart" asp-page-handler="AddToCart" hidden Some JS to .click() the input. .cs : public async void OnPostAddToCart() { //code } 到目前为止,我还没有找到

在我的.NETCoreRazor页面项目中,我希望在不重新加载页面的情况下从cshtml输入调用服务器端方法。我还是一个有剃须刀页面的新手

.cshtml : 

input type="submit" id="AddCart" asp-page-handler="AddToCart" hidden

Some JS to .click() the input.

.cs :
public async void OnPostAddToCart()
{
//code
}
到目前为止,我还没有找到一种方法来阻止重新加载页面并仍然访问我的服务器端方法

谢谢

编辑: 通过查看brad提供的链接,我成功地实现了它

我添加了@Page“{handler?}”来编写没有处理程序的url(不确定这对ajax是否重要), 我将我的ajax url设置为“页面/theMethod”, 我用[ValidateAntiForgeryToken]装饰了我的razor控制器类 并提到ajax中的防伪令牌:

$.ajax({
                url: "/mainPage/AddToCart",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                beforeSend: function (xhr) {
                    xhr.setRequestHeader("XSRF-TOKEN",
                        $('input:hidden[name="__RequestVerificationToken"]').val());
                },
                success: function () {
                    alert("success");
                },
                complete: function () {
                    alert("complete")
                },
                failure: function () {
                    alert("failure");
                }
            });

如果不想重新加载页面,则必须使用
ajax
XMLHttpRequest
(前者基于后者)

控制器方法

 public class MyController:Controller
 {
    [HttPost]
    [Route("/OnPostAddToCart")]
    public async Task AddToCart(object data)
    {

    }
 }

p.S有关的详细信息,请首先更改处理程序方法的命名,如下所示:

 public async void OnPostAddToCartAsync()
    {
        //code
    }
有关命名约定的更多详细信息,请参阅

其次,如果您想在Razor页面中使用ajax,URL模式应该类似于“/mainPage?handler=AddToCart”。需要注意的是,Razor页面的设计是为了防止()攻击。因此,Razor页面中自动包含反伪造令牌生成和验证。我相信这就是问题所在。如果您的HTML中有表单标记,则您的页面上可能存在反伪造标记。但是您需要在Ajax请求中传递相同的消息

  • 如果没有,请使用
    @Html.AntiForgeryToken()
    添加反伪造令牌 现在

  • 修改Ajax请求以在请求头中发送相同的请求,如 下:

    阅读本文,了解更多关于使用ASP.NET核心页面发出ajax请求的信息

  • .cshtml : 
    
    input type="submit" id="AddCart" asp-page-handler="AddToCart" hidden
    
    Some JS to .click() the input.
    
    .cs :
    public async void OnPostAddToCart()
    {
    //code
    }
    

目前仅靠razor页面无法做到这一点,您必须使用AJAX。或者,如果您有足够的勇气使用最前沿的实验框架,您也可以尝试一下;)请参阅以获取有关回拨剃须刀页面的更多信息谢谢您的帮助。我仍然无法使用此ajax访问AddToCart方法:$.ajax({url:/mainPage?handler=AddToCart],键入:“POST”,成功:函数(){alert(“success”);},完成:函数(){alert(“complete”)},失败:函数(){alert(“failure”);});我收到“complete”警报。您需要指定完整的
url
才能到达您的服务器。找出服务器运行的
hostname
port
是什么,并将
url
属性设置为:
http://[hostname]:[port]/OnPostAddToCart
主页面中的AddToCart方法。如果我使用input id=“AddCart”type=“submit”asp page handler=“AddToCart”,我将到达该方法,并且在代码执行后,我的url为。我已尝试将url属性设置为:;或者没有成功。如果你想从你的
控制器
找到一个
方法
,你必须将url设置为
[baseurl]/[controller method]
,并像我在上面的例子中那样用
路由
属性装饰你的
控制器方法
。谢谢你的帮助Adrian。查看控制器方法,您不能用route和HttPost属性修饰razor页面处理程序方法。
 public async void OnPostAddToCartAsync()
    {
        //code
    }
<input type="button" id="AddCart"  onclick="clickbtn()" value="Submit"/>
function clickbtn() {
    $.ajax({
        url: "/Test?handler=AddToCart",
        type: 'POST',
        beforeSend: function (xhr) {
            xhr.setRequestHeader("X-XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
        },
        success: function ()
        {
            alert("success");
        },
        complete: function ()
        {
            alert("complete")
        },
        failure: function ()
        {
            alert("failure");
        }
    });
}
services.AddAntiforgery(option => option.HeaderName = "X-XSRF-TOKEN");