【问题标题】:Model validation with Razor Pages使用 Razor Pages 进行模型验证
【发布时间】:2018-06-10 14:01:42
【问题描述】:

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

感谢您分享的任何信息。

雅各布

【问题讨论】:

    标签: validation razor asp.net-core model-validation razor-pages


    【解决方案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

    【讨论】:

    • Ruard 感谢您提供所有信息。我尝试输入 action="home#contact" 但它不工作(页面打开时出现错误“此页面不工作”)。出现错误后,当我在地址栏中的 url 上按 enter 时,会显示联系表单。
    • 也许动作路径不正确,因为哈希实际上并没有做任何事情。它只是浏览器中的内容,不会发送到服务器。我自己实现了这个,我可以确认它有效。
    • 再次感谢您的帮助。我正在使用我在此处发布的解决方案。
    【解决方案2】:

    也许是远程验证?

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多