gpt4 book ai didi

asp.net-core-2.0 - ASP.NET 核心在 Get 和 Post 错误验证之间保持值

转载 作者:行者123 更新时间:2023-12-04 08:33:03 25 4
gpt4 key购买 nike

我是 Web 开发的新手,所以我不知道如何在请求之间保留数据的好方法。

到目前为止,这是我的网站:

enter image description here

根据 titleId 查询参数,从 GET 请求上的 API 获取大象标题。当我按下登录时,正在运行模型验证,例如必须输入电子邮件和密码。但是,当返回错误页面时,大象文本是空的,因为该值没有保留。保持该值的最佳方法是什么,以便在返回 POST 错误时仍然可见?它是否必须包含在 POST 数据中?我不想再次请求 API。

后面的代码:

public class IndexModel : PageModel
{
private string apiTitle;
public string ApiTitle { get { return apiTitle; } set { apiTitle = value; } }

// Bind form values
[BindProperty]
public User user { get; set; }

public Task<IActionResult> OnGetAsync(string titleId)
{
if (!string.IsNullOrEmpty(titleId))
{
ApiTitle = await GetTitleFromApiAsync(titleId);
}
return Page();
}

public async Task<IActionResult> OnPostLoginAsync()
{
if (!IsLoginFormValid())
{
// When this is returned, for example if no password was entered,
// elephant title goes missing since apiTitle is null?
return Page();
}

var user = await LoginEmailAsync();
return RedirectToPage("/Profile");
}
}

html:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}

<link rel="stylesheet" href="css/index.css">

<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>

<div class="login-page">

<span id="label_api_title">@Model.ApiTitle</span>

<div class="form">
<form class="login-form" method="post" asp-page-handler="Login">
<input type="text" placeholder="Email" asp-for="User.Email"/>
<span asp-validation-for="User.Email" class="text-danger"></span>
<input type="password" placeholder="Password" asp-for="User.Password1" />
<span asp-validation-for="User.Password1" class="text-danger"></span>
<button>login</button>
<p class="message">Not registered? <a href="#">Create an account</a></p>
</form>
</div>
</div>

<script src="js/index.js"></script>

最佳答案

是的。您看到的是预期的行为。请记住, http是无状态的 .您正在进行 2 个单独的 http 调用,一个用于 GET,一个用于 POST。第二个电话不知道第一个电话做了什么(甚至根本没有第一个电话!)

如果你想有办法阅读 ApiTitle Post 调用中的属性值并将其返回给 View ,您需要将其保存在某处,以便在 http 调用之间可用。但是在您的情况下,您只需将其包含在表单中并让框架为您绑定(bind)它。

在您的情况下,您可以为此简单地使用公共(public)属性(可设置和可获取)。无需保留私有(private)变量。用 BindProperty 装饰您的属性(property)属性,因此模型绑定(bind)器将绑定(bind)此属性上的数据。

public class CreateModel : PageModel
{
[BindProperty]
public string ApiTitle { get; set; }

//Your existing code goes here
}

现在在您的表单标签中,为 ApiTitle 输入隐藏元素.这样,当表单提交时,ApiTitle 属性的值将被发送到请求数据中。
<form class="login-form" method="post" asp-page-handler="Login">
<input type="hidden" asp-for="ApiTitle"/>
<input type="text" placeholder="Email" asp-for="User.Username"/>
<!--Your other existing form elements -->
<button>login</button>
</form>

现在在您的 OnPostLoginAsync方法,您可以根据需要读取 ApiTitle 值。返回页面时(验证失败时),UI 将显示 ApiTitle span 元素中的属性值。
public async Task<IActionResult> OnPostLoginAsync()
{
var title = this.ApiTitle; // If you want to read this value

if (!ModelState.IsValid)
{
return Page();
}
return RedirectToPage("/Profile");
}

关于asp.net-core-2.0 - ASP.NET 核心在 Get 和 Post 错误验证之间保持值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47398439/

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