MVC验证&下拉列表可以为空的元素

时间:2017-10-23 11:49:23

标签: c# asp.net-mvc validation

我即将完成我的第一个MVC网络应用程序,我非常感谢它教给我的东西,但我仍然无法想出一些小问题。

  1. 验证 所以在我的模型中我得到了这个:

    [Required(ErrorMessage = "The email address is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    public string EmailAddress { get; set; }
    
  2. 但事情并非单一的注释正常。 https://i.imgur.com/WG9JBQ1.jpg 它显示我没有指定的错误(看起来更好)。但主要的问题是它从不检查字段是否为空(或者有5个以上的字符,甚至更好)。 我得到了jquery.validate.js,jquery.validate.unobtrusive.js和ClientValidationEnabled,UnobtrusiveJavaScriptEnabled都是真的。我无法弄清楚我在这里错过了什么。其他类型的字段也这样做。 我的控制器动作如下所示:

    [HttpPost]
        public ActionResult SaveEmail(EmailModel model)
        {
            if (ModelState.IsValid)
            {
                int x = 0;
                string[] stringedIds = model.ParseIds.Split('/');
    
                model.Id = Int32.TryParse(stringedIds[0], out x) ? x : 0;
                model.Contact = Int32.TryParse(stringedIds[1], out x)? contactsManager.GetById(x) : null;
    
                model.EmailType = emailTypesManager.GetById(model.EmailType.Id);
    
                if (model.Contact != null)
                {
                    EmailManager.Save(model);
                }
            }
            return RedirectToAction("Details", "Contact",new { @id = model.Contact.Id } );
        }
    
    1. 我选择了一种电子邮件的下拉菜单。它有点需要可以为空(你可以选择但不必)。我不知道如何做这项工作。使用当前的数据,它就像一个魅力,但它不是可空的。我无法弄清楚如何将新元素添加到列表中(在列表的第一位)并使其为'null'。 这就是填补它的原因:

      @{
          EmailTypes emailTypesManager = new EmailTypes();
          IEnumerable<EmailTypeModel> emailTypes = emailTypesManager.GetAll().Select(x => (EmailTypeModel)x);
      }
      @Html.DropDownListFor(x => x.EmailType.Id, new SelectList(emailTypes, "Id", "Name", Model.EmailType.Id), new { @class = "no-borders-drop" })
      @Html.ValidationMessageFor(x => x.EmailType.Name)
      
    2. 我认为改为..

              @{
                  EmailTypes emailTypesManager = new EmailTypes();
                  IEnumerable<EmailTypeModel> emailTypes = emailTypesManager.GetAll().Select(x => (EmailTypeModel)x);
                  var list = new SelectList(emailTypes, "Id", "Name", Model.EmailType.Id);
              }
              @Html.DropDownListFor(x => x.EmailType.Id, list,"None" , new { @class = "no-borders-drop" })
              @Html.ValidationMessageFor(x => x.EmailType.Name)
      

      ..让我更近了一步。

      有人能指出我吗? 谢谢(:

      更新1: 我刚刚意识到我在jQuery本身之前调用了jquery.validation。所以这解决了我的问题。验证工作现在但我仍然想知道如果它不是jquery.validation,那么图片上的验证是什么样的。

      https://i.imgur.com/WG9JBQ1.jpg

1 个答案:

答案 0 :(得分:0)

  1. 将以下数据注释属性放在属性上方
  2. [Required(ErrorMessage = "The email address is required")] [MinLength(5),ErrorMessage="User name can't be less than 5 characters"] [MaxLength(20, ErrorMessage="User name can't be more than 20 characters")] [EmailAddress(ErrorMessage = "Invalid Email Address")] public string EmailAddress { get; set; }

    1. 根据我对您的问题的理解,您可以使用选项标签,如下所示
    2. @Html.DropDownListFor(x => x.EmailType.Id, list,"this is optional label" , new { @class = "no-borders-drop" })

      如果选择第一个选项,则该值将为空。

      要获取模型状态错误,请将以下代码放在if(ModelState.Isvalid){}代码块

      下面
      foreach (ModelState modelState in ViewData.ModelState.Values) {
          foreach (ModelError error in modelState.Errors) {
              DoSomethingWith(error);
          }
      }
      

      在for循环中放置断点,在这里您可以找到您缺少的验证规则。

      最好的方法是返回模型状态错误以查看return View(model);

      在你的情况下,你可以做

           if (!ModelState.IsValid)
                  {
          //model state is not valid
          return view(model);
              }
      else
      {
      //your code here
      }