【问题标题】:MVC AddModelError not showing upMVC AddModelError 未显示
【发布时间】:2014-08-26 16:19:35
【问题描述】:

我查看了this SO post 并按照第一个答案所做的操作,我也做了同样的事情,但我仍然无法看到出现的错误。

模型的相关部分是:

[Display(Name = "Verify13", ResourceType = typeof(Resources.Resource))]
public bool Is13 { get; set; }

控制器是:

if (registerModel.Is13 == false)
{
    ModelState.AddModelError("REGISTER_0", "You must be 13 of age or older to receive email updates.");
    return View(registerModel);
}

视图的部分是:

@Html.ValidationSummary(true)
...
@Html.LabelFor(model => model.Is13)
@Html.CheckBoxFor(model => model.Is13)
@Html.ValidationMessage("REGISTER_O")

我做错了什么?模型的其余部分具有字段属性。整个模型如下图所示。错误消息(必填字段)。除了这个之外,每个错误都会出现。

public class RegisterViewModel
{
    [Display(Name = "FirstName", ResourceType = typeof(Resources.Resource))]
    [Required(ErrorMessageResourceType = typeof(Resources.Resource),
              ErrorMessageResourceName = "FirstNameRequired")]
    [StringLength(50, ErrorMessageResourceType = typeof(Resources.Resource),
                      ErrorMessageResourceName = "FirstNameLong")]
    public string FirstName { get; set; }

    [Display(Name = "LastName", ResourceType = typeof(Resources.Resource))]
    [Required(ErrorMessageResourceType = typeof(Resources.Resource),
              ErrorMessageResourceName = "LastNameRequired")]
    [StringLength(50, ErrorMessageResourceType = typeof(Resources.Resource),
                      ErrorMessageResourceName = "LastNameLong")]
    public string LastName { get; set; }

    [Display(Name = "Email", ResourceType = typeof(Resources.Resource))]
    [Required(ErrorMessageResourceType = typeof(Resources.Resource),
              ErrorMessageResourceName = "EmailRequired")]
    [RegularExpression(".+@.+\\..+", ErrorMessageResourceType = typeof(Resources.Resource),
                                     ErrorMessageResourceName = "EmailInvalid")]
    public string Email { get; set; }

    [Display(Name = "ConfirmEmail", ResourceType = typeof(Resources.Resource))]
    [Required(ErrorMessageResourceType = typeof(Resources.Resource),
            ErrorMessageResourceName = "ConfirmEmailRequired")]
    [RegularExpression(".+@.+\\..+", ErrorMessageResourceType = typeof(Resources.Resource),
                                     ErrorMessageResourceName = "EmailInvalid")]
    public string ConfirmEmailAddress { get; set; }

    [Display(Name = "Password", ResourceType = typeof(Resources.Resource))]
    [Required(ErrorMessageResourceType = typeof(Resources.Resource),
              ErrorMessageResourceName = "PasswordRequired")]
    public string Password { get; set; }

    [Display(Name = "ConfirmPassword", ResourceType = typeof(Resources.Resource))]
    [Required(ErrorMessageResourceType = typeof(Resources.Resource),
              ErrorMessageResourceName = "ConfirmPasswordRequired")]
    public string ConfirmPassword { get; set; }

    [Display(Name = "ZipCode", ResourceType = typeof(Resources.Resource))]
    [Required(ErrorMessageResourceType = typeof(Resources.Resource),
              ErrorMessageResourceName = "ZipCodeRequired")]
    public string ZipCode { get; set; }

    public string[] VideoProvider { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }

    [Display(Name = "Verify13", ResourceType = typeof(Resources.Resource))]
    public bool Is13 { get; set; }

【问题讨论】:

  • 您的代码运行良好。错误返回视图后检查 html。你应该看到&lt;span class="field-validation-error" data-valmsg-for="REGISTER_0" data-valmsg-replace="true"&gt;You must be 13 ....&lt;/span&gt;。我怀疑你有一些 .css 属性阻止它显示。

标签: c# asp.net-mvc


【解决方案1】:

或者你可以装饰你的财产。

private bool isTrue
{ get { return true; } }

[Required]
[Display(Name = "I agree to the terms and conditions")]
[Compare("isTrue", ErrorMessage = "Please agree to Terms and Conditions")]
public bool iAgree { get; set; }

这是@fields.cage 答案here

这样你的验证逻辑就在它应该在的地方,并且你可以像其他地方一样绑定它。

编辑

在给出我认为你想看到的输出的代码下方。为简单起见,我只实现了 firstname 和 is13 字段。

型号:

public class RegisterViewModel
{
    [Display(Name = "FirstName")]
    [Required]
    public string FirstName { get; set; }

    public bool isTrue
    { get { return true; } }

    [Display(Name = "Verify13")]
    [Required]
    [System.Web.Mvc.CompareAttribute("isTrue", ErrorMessage = "You must be 13 of age or     older to receive email updates.")]
    public bool Is13 { get; set; }
}

查看:

@using (Html.BeginForm("Index", "Home"))
{
    <table>
        <tr>
            <td>@Html.LabelFor(s => s.FirstName)</td>
            <td>@Html.TextBoxFor(s => s.FirstName)</td>
            <td>@Html.ValidationMessageFor(s => s.FirstName)</td>
        </tr>
        <tr>
            <td>@Html.LabelFor(s => s.Is13)</td>
            <td>@Html.CheckBoxFor(s => s.Is13)</td>
            <td>@Html.ValidationMessageFor(s => s.Is13)</td>
        </tr>
    </table>

    <button type="submit">Send</button>
}

控制器:

[HttpPost]
public ActionResult Index(RegisterViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    return View(model);
}

【讨论】:

  • 我这样做了,但它没有显示出来,因为我正在使用 CheckBoxFor 并且它在复选框顶部显示标签,而不是在它旁边,就在错误消息应该显示的位置
  • 我编辑了我的答案。我认为在设置验证消息和标签的位置时,表格会起到作用。
【解决方案2】:

您是否将这 2 个 javascript 文件添加到您的视图中(用于客户端验证):

~/Scripts/jquery.validate.min.js
~/Scripts/jquery.validate.unobtrusive.min.js

如果你使用 Ajax.BeginForm( ) 函数,你还需要这个文件:

~/Scripts/jquery.unobtrusive-ajax.min.js

【讨论】:

  • 将前两个添加到表单的语法是什么?为什么必填属性字段不存在时会显示错误?
  • 只需将文件添加为任何javascript file
  • 那行不通。必填字段的所有其他错误消息(例如我设置邮政编码的方式)都会显示出来。除此以外的所有字段
猜你喜欢
  • 2011-06-08
  • 2016-03-02
  • 2014-06-21
  • 2016-09-18
  • 1970-01-01
  • 2013-09-18
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多