【问题标题】:MVC Validation & Drop down list nullable elementMVC 验证和下拉列表可为空的元素
【发布时间】:2017-10-25 18:48:01
【问题描述】:

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

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

    [Required(ErrorMessage = "The email address is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    public string EmailAddress { get; set; }
    

但问题是,没有一个注释是正确的。 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. 我得到了这个用于选择电子邮件类型的下拉菜单。而且它需要可以为空(您可以选择它但不必这样做)。我不知道如何使这项工作。使用当前数据,它就像一个魅力,但它不能为空。我不知道如何将新元素添加到列表中(在列表中的第一位)并使其为“空”。 这就是填充它的内容:

    @{
        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)
    

我想改成..

        @{
            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

【问题讨论】:

  • 能不能给出完整的代码看懂..
  • 对于第一个问题,输入元素应该是 type="text" 以进行模型验证......
  • 我刚刚更新了我的问题。验证现在有效:D
  • 图片是 HTML-5 验证错误。作为旁注,@Html.ValidationMessageFor(x =&gt; x.EmailType.Name) 没有任何意义,因为您绑定到 EmailType.Id
  • 是的,我删除了它。谢谢。

标签: c# asp.net-mvc validation


【解决方案1】:
  1. 将以下数据注释属性放在您的属性上方

[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. 根据我对您问题的理解,您可以使用如下选项标签

@Html.DropDownListFor(x =&gt; 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
}

【讨论】:

  • 是的,我明白这一点,但是当我选择“无”选项时,您会看到它甚至不会进入控制器。 @Html.DropDownListFor(x => x.EmailType.Id, list,"None" , new { @class= "no-borders-drop" }) 我什至删除了 ValidationMessageFor。
  • 问题是当我选择电子邮件类型无时,模型没有通过控制器中的 IsValid 检查。
  • 如果你让 email typeId 可以为空呢?
  • 每一层都可以为空。
  • 我已更新我的答案以获取视图和控制器中的验证错误,请检查并告诉我
猜你喜欢
  • 2017-05-09
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多