6

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

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

在此处输入图像描述

根据 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>
4

2 回答 2

10

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

如果您想有一种方法来读取ApiTitlePost 调用中的属性值并将其返回到视图,则需要将其保存在某处,以便在 http 调用之间可用。但是在您的情况下,您只需将其包含在表单中并让框架为您绑定它。

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

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");
}
于 2017-11-23T18:47:49.347 回答
0

可能是您没有在剃刀中的表单中发送它,并且仅在获取请求中而不是在发布请求中发送:

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

//-->需要在post中传递title id

public async Task<IActionResult> OnPostLoginAsync(string titleId)
{



 if (!string.IsNullOrEmpty(titleId))
        {
            ApiTitle = await GetTitleFromApiAsync(titleId);
        }

    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");
}

并在您的剃须刀中添加以下形式的跨度:

 <span id="label_api_title">@Model.ApiTitle</span>   
<div class="form">
        <form class="login-form" method="post" asp-page-handler="Login">
         <span id="label_api_title">@Model.ApiTitle</span>/*<--------here*/
        <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>
于 2017-11-20T18:32:39.023 回答