如何在 OnPost 之后将模型保留在我的视图中?

Tho*_*mas 7 c# asp.net-core razor-pages

我正在使用 .Net Core 进行一个项目,并且正在使用 ASP Razor Pages。在我的模型中,我有一个 OnGet,它在我的视图中加载我需要的所有数据。

public IList<Projet> Projets { get; set; }
public ActionResult OnGet()
{
    Projets = _serviceSelect.getProjets();
    return Page();
}
Run Code Online (Sandbox Code Playgroud)

然后,在我提交表单时激活的 OnPost 中。

<form method="post">
    <div asp-validation-summary="All" class="text-danger"></div>
    <input type="radio" value="1" asp-for="LoginData.TypeCompte" />choice<br />
    Username: <input asp-for="LoginData.Username" /><br />
    Password: <input asp-for="LoginData.Password" /><br />
    Remember me: <input asp-for="LoginData.RememberMe" type="checkbox" /><br />
    <input asp-page-handler="connexion" type="submit" value="Login" />
    @Html.AntiForgeryToken()
</form>
Run Code Online (Sandbox Code Playgroud)

我想使用我的 ModelState 在我的视图中显示一个错误。

public ActionResult OnPostConnexion()
{
    if (ModelState.IsValid)
    {
       // Do stuff 
    }
    else
    {
        ModelState.AddModelError("", "username or password is blank");
        return Page();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我返回 Page() 时,就像重新加载模型一样,当我尝试访问我的数据时,我的对象为空。

 Object reference not set to an instance of an object.
@foreach (var item in Model.Projets)
Run Code Online (Sandbox Code Playgroud)

如何在不丢失模型中包含的数据的情况下更新我的视图?

小智 5

我通过替换return Page();return this.OnGet();in解决了这个问题public ActionResult OnPostConnexion()

这样,您在 OnGet 中填充 PageModel 属性的任何逻辑都会被重用。

所以我的完整示例如下所示:

    public IEnumerable<SelectListItem> CompanyListing { get; private set; }

    public async Task<IActionResult> OnGet()
    {
        if (!string.IsNullOrEmpty(this.ErrorMessage))
        {
            this.ModelState.AddModelError(string.Empty, this.ErrorMessage);
        }

        this.CompanyListing = await this.PopulateCompanyList();
        return this.Page();
    }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!this.ModelState.IsValid)
        {
            // Something failed. Redisplay the form.
            return await this.OnGet();
        }

        return this.RedirectToPage("/");
    }
Run Code Online (Sandbox Code Playgroud)


j90*_*749 1

您收到对象引用错误的原因是因为返回视图时尚未填充 Model.Projects,因此无法在 foreach 循环中进行迭代。

根据现有代码,您可以在返回页面之前再次填充模型。

public ActionResult OnPostConnexion()
{
    if (ModelState.IsValid)
    {
       // Do stuff 
    }
    else
    {
        Projets = _serviceSelect.getProjets();

        ModelState.AddModelError("", "username or password is blank");
        return Page();
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的解决方案是:

public ActionResult OnPostConnexion(viewModel model)
{
    if (!ModelState.IsValid)
    {
       return View(model);
    }
    else
    {
        //do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为它是 Razor 页面项目,所以我无法返回“View()” (2认同)