gpt4 book ai didi

c# - ASP.NET Core 2,使用没有 MVC 的 Razor 页面单击按钮

转载 作者:太空狗 更新时间:2023-10-29 18:26:25 25 4
gpt4 key购买 nike

正如有人在评论中指出的那样,Razor 页面不需要 Controller ,就像您在 MVC 中习惯做的那样。我现在 Razor 也没有对按钮单击事件的 native 处理。要在用户单击按钮时(在“代码隐藏”中)执行某些操作,我们至少有两个选项:

  • 使用提交按钮
  • 使用ajax调用

我找到了很多 MVC 示例,它们展示了如何定义 Controller 函数。但如前所述,我没有。

因此,我试图理解这两种方式。这是我的测试 cshtml:

<form method="post">
<input type="submit" class="btn btn-primary" value="way1">Way 1/>
</form>

<button id="btn" type="button" class="btn btn-primary" value="way2">Way 2</button>

<script>
$(document).ready(function() {
$("#btn").click(function (e) {
e.preventDefault();
$.ajax({
url: "@Url.Action("Way2")",
type: "POST",
data: "foo",
datatype: "text",
success: function (data) {
alert(data);
}
});
return false;
});
});
</script>

这里是 cshtml.cs:

公共(public)类 TestModel : PageModel{ 私有(private)只读 MyContext _context;

public TestModel(MyContext context)
{
_context = context;
}

public IActionResult OnPost()
{
// here I can put something to execute
// when the submit button is clicked
}

public ActionResult Way2(string data)
{
// this is never triggered
}

问题

  1. 使用“Way1”(提交)我能够捕捉到按钮的点击,但有一些缺点。默认情况下,页面会因帖子而重新加载。有时我不需要更改任何内容,只需调用一个 C# 函数即可。但我不明白如何处理多个按钮。 IE。如果我有 5 个按钮,如何为每个按钮做不同的事情?

  2. 对于“Way2”,我做错了一些事情,因为从未达到 cs 代码中的功能,并且我收到错误请求错误 (400)。我错过了什么?

最佳答案

普通表单提交

在进行正常的表单提交时,按照惯例,您需要处理程序方法名称遵循 On{{HttpVerb}}{{YourHanderName}} 格式

public ActionResult OnPostWay2(string data)
{
// to do : return something
}

现在确保您的提交按钮位于 form 标记内,并且您提到了 asp-page-handler。该属性的值应该是页面模型类中的处理程序名称 (Way2)

<form method="POST">       
<button type="submit" asp-route-data="foo" asp-page-handler="Way2">Way 2</button>
</form>

以上代码将为带有 formaction attribute 的按钮生成标记设置为 url yourBaseUrl/YourPageName?data=foo&handler=Way2。当用户单击提交按钮时,它将发布此 url 表单,因为 formaction 属性值将覆盖表单的默认操作 url。当收到请求时,razor 页面框架将使用此参数 (handler) 并将请求定向到相应的处理程序方法。

Ajax 调用

您收到 400(错误请求)响应,因为框架需要 RequestVerificationToken 作为发布的请求数据的一部分。如果您检查页面的 View 源,您可以在表单中看到一个名为 __RequestVerificationToken 的隐藏输入元素。该框架使用它来防止可能的 CSRF 攻击。如果你的请求没有这个信息,框架会返回400 bad request。

要使您的 ajax 代码有效,您所要做的就是显式发送它。这是一个工作示例

$("#btn").click(function(e) {
e.preventDefault();

var t = $("input[name='__RequestVerificationToken']").val();
$.ajax({
url: $(this).attr("formaction"),
headers:
{
"RequestVerificationToken": t
},
type: "POST",
data: { data: 'foo2' },
}).done(function(data) {
console.log(data);
}).fail(function(a, v, e) {
alert(e);
});
});

现在因为你正在调用 ajax,所以返回一个 json 响应是有意义的

public ActionResult OnPostWay2(string data)
{
return new JsonResult("Received "+ data + " at "+DateTime.Now);
}

在上面的示例中,我们使用一些 jQuery 代码来获取名称为 __RequestVerificationToken 的输入元素并读取它的值。一种更可靠的方法是将 IAntiforgery 实现注入(inject) View 并使用 GetAndStoreTokens 方法。

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
public string GetAntiXsrfRequestToken()
{
return Xsrf.GetAndStoreTokens(Model.HttpContext).RequestToken;
}
}
<script>
$(function () {

$("#btn").click(function(e) {
e.preventDefault();
var t = '@GetAntiXsrfRequestToken()';
$.ajax({
url: $(this).attr("formaction"),
headers:
{
"RequestVerificationToken": t
},
type: "POST",
data: { data: 'foo2' },
}).done(function(data) {
console.log(data);
}).fail(function(a, v, e) {
alert(e);
});
});
})
</script>

关于c# - ASP.NET Core 2,使用没有 MVC 的 Razor 页面单击按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459793/

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