0

我有一个位于页面底部的表单。当服务器端的模型验证失败时,返回 Page() 让我回到页面顶部,这非常不方便,因为用户必须向下滚动到表单才能查看验证错误。我的问题是: 1. 我可以重定向到联系表格 div ID 吗?2. 最好的情况是如果模型验证可以异步完成,那么只有部分页面刷新。那可能吗?(这在使用 UpdatePanel 的 Web 窗体中很容易完成)。

我很感激你可能分享的任何信息。

雅各布

4

3 回答 3

1

也许远程验证?

“当您需要根据服务器上的数据验证客户端上的数据时,远程验证是一项很棒的功能。例如,您的应用程序可能需要验证电子邮件或用户名是否已在使用中......” https:/ /docs.microsoft.com/en-us/aspnet/core/mvc/models/validation

于 2017-12-31T17:12:14.777 回答
1

首先尝试在客户端上进行验证,以防止不必要的回发。您可以使用属性来设置验证:

using System.ComponentModel.DataAnnotations;

public class ForgotPasswordViewModel()
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }
}

在视图中检查模型状态:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
    if (ModelState.IsValid)
    {

当然客户端是不够的,所以如果客户端验证被跳过,服务器会确保模型验证。

滚动到某个位置的一种方法是使用锚点。锚点是一种在文档中为部分添加书签的客户端方式。通常你会看到这样的东西:

<a href"home#contact">Contact</a>

通过单击链接,您将滚动到contact主文档中的书签。您可以对帖子执行相同的操作:

<div id="contact">
    <form method="post" action="home#contact">
        @Html.AntiForgeryToken()

    </form>
</div>

如果出现错误,页面将自动滚动到表单,因为在客户端#contact设置了哈希。假设是,如果成功,您将重定向到另一个视图。这是不使用 javascript 滚动的唯一方法。而且由于javascript验证不起作用......

请注意,如果您使用标签助手,则会自动添加 .Net Core AntiForgery。但由于我没有使用它,我必须自己添加它。

还有其他选项涉及 javascript 或某些服务器端重定向,但我认为这是一个简单的解决方案。

我不知道部分页面刷新是否是最好的解决方案。我认为这取决于。有很多关于如何发布异步的示例。检查此链接:https ://www.w3schools.com/jquery/ajax_ajax.asp

于 2017-12-30T16:41:41.143 回答
0

我找到了适合我的解决方案:

@if (Model.validationError)
    {
        <text>
        document.getElementById('contact').scrollIntoView();
        </text>

    }
于 2018-01-02T17:18:08.047 回答