ModelState.AddModelError 在 asp.net.core RAZOR 页面中不显示任何消息

Posted

技术标签:

【中文标题】ModelState.AddModelError 在 asp.net.core RAZOR 页面中不显示任何消息【英文标题】:ModelState.AddModelError doesn't show any message in asp.net.core RAZOR pages 【发布时间】:2019-06-16 21:34:48 【问题描述】:

在我的测试 ASP.NET.CORE 项目中,我在我的 razor codeBehind 页面中添加了一个 ModelState 自定义错误,但它对 html.ValidationMessageFor 没有任何作用。我必须重定向到 OnGetAsync() 方法只是为了不接收 nullref 异常

所以,我尝试从弹出模式中替换表单,但它没有帮助,连接脚本与布局部分视图并直接到页面不会给出任何结果,也重命名标签。

这是我的页面背后的代码

namespace TourStats.Pages

  public class Index : PageModel
  
    private readonly TourStats.Models.PlayerStatsDBContext _context;
    public Index(TourStats.Models.PlayerStatsDBContext context)
    
      _context = context;
    

    [BindProperty]
    public Table Table  get; set; 
    [BindProperty]
    public IList<Table> Tables  get; set; 

    public async Task OnGetAsync()
    
      Tables = await _context.Tables.ToListAsync();
    

    public async Task<IActionResult> OnPostAsync()
    
      if (ModelState.IsValid && Table != null)
     
        try
          
            Table.GameData = DateTime.Now;
            _context.Tables.Add(Table);
            await _context.SaveChangesAsync();
          
          catch(Exception)
                           
            ModelState.AddModelError("Table", "exc1");                    
                       
      
        return RedirectToAction("OnGetAsync");                     
    
  

这是我的 Razor 页面

@page
@using System.Runtime.CompilerServices
@using TourStats.Models
@model TourStats.Pages.Index
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers


@
Layout = "_Layout";    


<head>
<!-- MY CSS -->
<link rel="stylesheet" type="text/css" href="~/css/playerPopup.css"/>
<!-- Validation Scripts -->
<script src="lib/jquery/dist/jquery.js"></script>
<script src="lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
<title>MyStats</title>
</head>
<body>
<!-- Create Table Popup Form -->
<div class="container">
<!-- Trigger the modal with a button -->
<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">create</button>

<div>
    <!-- Modal -->
    <div class="modal fade" id="myModal" role="dialog">
        <div class="modal-dialog">

            <!-- Modal content-->
            <div class="modal-content">
                <div class="modal-header">    
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                </div>
                <div class="modal-body">
                    <form method="post">
                        @Html.AntiForgeryToken()

                        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                        <div class="form-group">
                            <label asp-for="Table.Name">Table name</label>
                            <input asp-for="Table.Name" class="form-control"/>
                            <span asp-validation-for="Table.Name" class="text-danger"></span>
                            @Html.ValidationMessageFor(m => m.Table)
                        </div>
                        <br>
                        <input type="submit" value="Create" class="btn btn-default"/>
                    </form>
                </div>
                <div class="modal-footer">

                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>

</div>

 @section Scripts
    @await Html.PartialAsync("_ValidationScriptsPartial")
 

【问题讨论】:

你应该使用核心的做事方式,而不是旧的4.5风格。因此,在正确的 PageModel 或控制器操作上使用标签助手而不是 html 助手和 ValidateAntiForgeryToken 属性。 【参考方案1】:

当您重定向时,您会丢失 ModelStatedictionary 中的所有内容。如果出现异常,您应该返回相同的页面,就像 ModelState 无效时一样:

public async Task<IActionResult> OnPostAsync()

    if (ModelState.IsValid && Table != null)
    
        try
        
            Table.GameData = DateTime.Now;
            _context.Tables.Add(Table);
            await _context.SaveChangesAsync();
         
         catch(Exception)
                          
             ModelState.AddModelError("Table", "exc1");  
             Tables = await _context.Tables.ToListAsync();
             return Page();                  
                      
    
   else
   
       Tables = await _context.Tables.ToListAsync();
       return Page(); 
   
   return RedirectToAction("OnGetAsync");                     
 

【讨论】:

这是有道理的,但我会得到一个空引用异常。我应该把我的表单放在局部视图还是smth? @EvgenyShmarev 你可能需要在调用return Page();时再次重新初始化Tables@我会更新答案来说明。

以上是关于ModelState.AddModelError 在 asp.net.core RAZOR 页面中不显示任何消息的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core Razor 页面中的“ModelState.AddModelError”显示不正确的错误消息

ModelState.AddModelError 在 asp.net.core RAZOR 页面中不显示任何消息

ModelState.AddModelError到字段的特定ValidationMessageFor?

ASP.Net MVC - GET/POST 具有不同模型时的 ModelState.AddModelError

工作总结 ModelState.AddModelError("ShiYiObject", "对象不能为空!"); 小知识

遍历ModelState中存储的错误信息