关于ASP最受欢迎的书籍之一。NET Core是Adam Freeman的“Pro ASP.NET Core 3”。
在第7-11章中,他构建了一个示例应用程序SportsStore。
如您所见,清单中的每个产品都有自己的“添加到购物车”按钮:
如果我们在这个页面上“查看源代码”,我们将在产品列表中看到该项目的以下HTML:
<div class="card card-outline-primary m-1 p-1">
<div class="bg-faded p-1">
<h4>
Kayak
<span class="badge badge-pill badge-primary" style="float:right">
<small>$275.00</small>
</span>
</h4>
</div>
<form id="1" method="post" action="/Cart">
<input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="1" />
<input type="hidden" name="returnUrl" value="/" />
<span class="card-text p-1">
A boat for one person
<button type="submit" class="btn btn-success btn-sm pull-right" style="float:right">
Add To Cart
</button>
</span>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8KKqNOS0gwdMvC0-bdjTwWlvCcBJldeidwIX5b2f24gYblS9X1sqCwJWIEsKKOSf8kut0SQsQRLF3R1XBSYZkPGnta9YzRK4tcQl8dq_0uWmjeUhm8yMe90fWDt_x0smmAD1lmb9-BxQF8y_7-IQSz4" /></form>
</div>
注意
input
标签朝向底部:
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8KKqNOS0gwdMvC0-bdjTwWlvCcBJldeidwIX5b2f24gYblS9X1sqCwJWIEsKKOSf8kut0SQsQRLF3R1XBSYZkPGnta9YzRK4tcQl8dq_0uWmjeUhm8yMe90fWDt_x0smmAD1lmb9-BxQF8y_7-IQSz4" />
如果我们看看
Views\Shared\ProductSummary.cshtml
文件中,我们将看到生成这些列表项所涉及的代码:
@model Product
<div class="card card-outline-primary m-1 p-1">
<div class="bg-faded p-1">
<h4>
@Model.Name
<span class="badge badge-pill badge-primary" style="float:right">
<small>@Model.Price.ToString("c")</small>
</span>
</h4>
</div>
<form id="@Model.ID" asp-page="/Cart" method="post">
<input type="hidden" asp-for="ID" />
<input type="hidden" name="returnUrl" value="@ViewContext.HttpContext.Request.PathAndQuery()" />
<span class="card-text p-1">
@Model.Description
<button type="submit" class="btn btn-success btn-sm pull-right" style="float:right">
Add To Cart
</button>
</span>
</form>
</div>
正如你所看到的
form
在本例中,元素没有显式包含
输入
贴上标签
__RequestVerificationToken
价值这
类型
因此,它似乎是一个标记助手,负责生成
输入
贴上标签
__RequestVerificationToken
代币
作为一个实验,让我们假设我添加了以下方法
Controllers\HomeController
:
[HttpGet]
public ContentResult ButtonExample()
{
var token = "...";
return new ContentResult()
{
ContentType = "text/html",
StatusCode = (int)HttpStatusCode.OK,
Content =
String.Format(
@"<!DOCTYPE html>
<html>
<body>
<form id=""1"" method=""post"" action=""/Cart"">
<input type=""hidden"" data-val=""true"" id=""ID"" name=""ID"" value=""1"" />
<button type=""submit"">Add to Cart</button>
</form>
<input name=""__RequestVerificationToken"" type=""hidden"" value=""{0}"" />
</body>
</html>",
token)
};
}
如您所见,这将生成一个非常简单的页面,其中有一个按钮,用于将ID值为1的产品(即Kayak)添加到购物车中。
我当然需要为
__RequestVerificationToken
.
我的问题是,有没有办法从C#得到这个值,这样我就可以把它包含在上面的方法中?
如上所示的想法是在这里设置令牌值:
var token = "...";
然后将其插入到使用
String.Format
.
使现代化
This page
提到以下内容:
要生成反XSRF令牌,请调用@Html。从MVC视图或@AntiForgery中查看AntiForgeryToken方法。从Razor页面获取HTML()。
所以我想问题是,我们如何直接从C#而不是从MVC视图或Razor页面进行等效?