下拉式自定义验证消息在MVC中被覆盖

本文关键字:MVC 覆盖 消息 自定义 验证 | 更新日期: 2023-09-27 18:24:54

我是一个MVC noob,我正试图通过添加ModelState.modelror来验证下拉列表并显示自定义错误消息。在内部,我的字段"Board"是屏幕上显示的下拉列表,它被称为"ProviderId"。在UI上,当我没有从下拉列表中选择值时,我想看到消息"Board cannot be empty",但我只看到"ProviderId field is required"。此方法似乎适用于其他编辑字段。

这是我的控制器代码

  [HttpPost]
        public ActionResult Create(CourseList courselist)
        {
           //This works! It shows Class Name cannot be Empty next to class field on submit
            if (courselist.CourseName == null)
            {
                ModelState.AddModelError("CourseName", " Class Name cannot be Empty");
                ViewBag.ProviderID = new SelectList(db.ProviderLists, "ProviderID", "ProviderName", courselist.ProviderID);
                return View(courselist);
            }
//This does not work! It shows the internal binding message instead of this custom message
            if (courselist.ProviderID == null)
            {
                ModelState.AddModelError("ProviderID", " Board cannot be Empty");
                ViewBag.ProviderID = new SelectList(db.ProviderLists, "ProviderID", "ProviderName", courselist.ProviderID);
                return View(courselist);
            }
            if (ModelState.IsValid)
            {
                db.CourseLists.Add(courselist);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.ProviderID = new SelectList(db.ProviderLists, "ProviderID", "ProviderName", courselist.ProviderID);
            return View(courselist);
        }

这是我的相关查看代码

 <div class="editor-field">
            @Html.DropDownList("ProviderID", String.Empty)
            @Html.ValidationMessageFor(model => model.ProviderID)
        </div>

它适用于其他两个编辑字段,即当我提交时,它会在字段旁边打印自定义消息,但它总是将内部绑定消息"providerId字段是必需的"放在下拉列表中。我必须做些什么才能将消息更改为自定义添加的消息。这发生在代码中我所有的下线上!ProviderId是DB中的必填字段,我看到了消息,但我如何覆盖它以显示自定义消息?也许这是一个简单的修复,但我对MVC完全没有兴趣(2小时),想修复这个

"板不能为空"

已编辑:字段为ProviderID

下拉式自定义验证消息在MVC中被覆盖

我想,您使用的是数据库优先(或模型优先)方法,因此您有一个edmx文件和相应的.Designer.cs文件。在最后一个文件中,您可能有这样的东西:

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int32 ProviderID

这里,类型int不可为null,并且该属性具有元数据属性IsNullable=false。这就是为什么ASP.NET MVC会给出默认的错误消息。

一个简单的解决方法是将数据库上的字段设置为非必需字段,然后更新模型。之后,您应该在.Designer.cs中看到这样的内容:

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public Nullable<global::System.Int32> ProviderID

现在,您可以看到自定义消息"Board cannot be empty"。

更好的方法(而不是更改数据库和模型)是从控制器中删除if (courselist.ProviderID == null)...并使用元数据。这里有一个片段:

[MetadataType(typeof(YourEntityMetaData))]
public partial class YourEntity
{
}
public class YourEntityMetaData
{   
   [Required(ErrorMessage = "Board cannot be empty")]
   public int ProviderID   { get; set; }    
}