【问题标题】:Razor Pages - Return Error on Duplicate NameRazor Pages - 重复名称返回错误
【发布时间】:2021-03-31 10:38:59
【问题描述】:

我正在处理一个 Razor Pages 表单,该表单接受一个字符串以在 SQL Server 数据库中创建一个新客户。我想让它工作,以便如果作为客户的字符串已经存在,则会出现一个提示“该客户已经存在”。只是为了保证数据完整性。

public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            int customerCheck = -1; //No Customer ID is -1
            try
            {
                using (var context = new DataWarehouseContext())
                {
                    customerCheck = context.Customer //Tries to grab a Customer with this name
                        .Where(a => a.Name == Customer.name)
                        .Select(b => b.CustomerId)
                        .FirstOrDefault();
                }
            }
            catch (Exception)
            {

            }

            if(customerCheck == -1)
            {
                _context.Customer.Add(Customer);
                await _context.SaveChangesAsync();
                return RedirectToPage("/Customer/List");
            }
            else
            {
                return Page();
            }         
        }

这是我目前在后端的代码。发生的情况是,当用户尝试创建新客户时,页面后端会尝试查看是否可以获取与此名称相关的客户 ID。如果可以,那么 customerCheck 的值不是 -1,因此应该打印出一些错误。

我不知道可以使用什么方法来做到这一点,所以任何帮助都会很棒!

【问题讨论】:

  • 要查找的内容:AddModelErrorValidationSummary。那些会让你到达那里。

标签: asp.net-core razor entity-framework-core razor-pages


【解决方案1】:

起初,很高兴听到您找到了解决方案。

此外,我认为您还可以使用远程验证来检查客户是否存在。检查以下示例代码:

  1. ASP.NET (Core) 中的远程验证依赖于Unobtrusive AJAX,因此您需要先安装它。最简单的方法是通过 LibMan。右击wwwroot中的lib文件夹,选择Add » Client-side Library,然后选择jsdelivr作为源,输入@ 987654327@,点击“安装”按钮安装包。

  2. 在 CreateCustomer.cshtml.cs 页面中,添加一个 Email 属性并使用PageRemote 属性,然后添加一个处理程序方法来执行验证。

         public class CreateCustomerModel : PageModel
         {
             private readonly IRepository _repository;
             public CreateCustomerModel(IRepository repository)
             {
                 _repository = repository;
             }
    
             [PageRemote(ErrorMessage = "Email Address already exists", AdditionalFields = "__RequestVerificationToken", HttpMethod = "post",PageHandler = "CheckEmail")]
             [BindProperty]
             public string Email { get; set; }
    
             public void OnGet()
             {
             }
    
             public IActionResult OnPost()
             {
    
                 if (ModelState.IsValid)
                 {
                     //insert data into database.
                 }
                 return Page();
             }
    
             #pragma warning disable MVC1001 // Filters cannot be applied to page handler methods.
             [ValidateAntiForgeryToken]
             #pragma warning restore MVC1001 // Filters cannot be applied to page handler methods.
             public JsonResult OnPostCheckEmail()
             {
                 //query database and check whether the email is exist or not.
                 var existingEmails = _repository.GetCustomers().Select(c => c.Email.ToLower()).ToList();
                 var valid = !existingEmails.Contains(Email.ToLower());
                 return new JsonResult(valid);
             }
    
  3. 在 CreateCustomer.cshtml razor 页面中,添加 JQuery 引用并添加表单以输入值。

     @page
     @model RazorSample.Pages.CreateCustomerModel
     @{
     }
     <div class="row">
         <div class="col-md-4">
             <form method="post" asp-antiforgery="true">
                 <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    
                 <div class="form-group">
                     <label asp-for="Email" class="control-label"></label>
                     <input asp-for="Email" class="form-control" />
                     <span asp-validation-for="Email" class="text-danger"></span>
                 </div>
                 @* add other fields *@
                 <div class="form-group">
                     <input type="submit" value="Create" class="btn btn-primary" />
                 </div>
             </form>
         </div>
     </div>
    
     @section scripts{
         <script src="~/lib/jquery/dist/jquery.min.js"></script>
         <partial name="_ValidationScriptsPartial" />
         <script src="~/lib/jquery-ajax-unobtrusive/jquery.unobtrusive-ajax.min.js"></script>
     }
    

提交按钮后,结果如下:如果邮箱存在,会提示:

[注意] 在上面的示例中,我们在 PageModel 中添加了属性(而不是嵌套模型),并使用它来验证字段。因为,如果使用嵌套对象,我们可能会遇到 400 Bad Request 结果。 400错误与AntiForgeryToken有关,如果遇到此错误,请尝试忽略验证AntiForgeryToken或在body或header自定义添加__RequestVerificationTokentoken,检查this link

有关 Razor 页面中的远程验证的更多详细信息,请查看以下文章:

Remote Validation in Razor Pages

Improved Remote Validation in Razor Pages

【讨论】:

    【解决方案2】:

    我找到了一个解决方案,而且实施起来并不难。当在后端发现重复的客户时,我创建了一个 ModelState.AddModelError 对象并用一个键和错误描述填充它。接下来,在前端,我把它放在一个 H3 标记中,这样打印出来:

    后端 OnPost() 代码

    public async Task<IActionResult> OnPostAsync()
            {
                if (!ModelState.IsValid)
                {
                    return Page();
                }
    
                int customerCheck = 0; //No Customer ID is 0
                try
                {
                    using (var context = new DataWarehouseContext())
                    {
                        customerCheck = context.Customer //Tries to grab a Customer with this name
                            .Where(a => a.Name == Customer.name)
                            .Select(b => b.CustomerId)
                            .FirstOrDefault();
                    }
                }
                catch (Exception)
                {
    
                }
    
                if(customerCheck == 0)
                {
                    _context.Customer.Add(Customer);
                    await _context.SaveChangesAsync();
                    return RedirectToPage("/Customer/List");
                }
                else
                {
                    ModelState.AddModelError("DuplicateCustomer", "This Customer Already Exists");
                    return Page();
                }
             
            }
    

    所以在前端,它是这样实现的:

    <h3 align="center" style="color:yellowgreen">@Html.ValidationMessage("DuplicateCustomer")</h3>
    

    return Page(); 被点击时,页面被重新加载并出现 DuplicateCustomer 错误。

    【讨论】:

    • 很高兴听到您找到了解决方案,请接受它 - 请参阅 What should I do when someone answers my question?。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
    • 但在这种情况下,h3 标记始终显示,例如,如果 h3 在 css 中有 background-color: red,那么红色块将始终存在
    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2019-06-12
    • 2021-05-14
    • 2016-12-02
    • 2021-01-01
    • 2021-04-24
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多