【问题标题】:Nested field form validation within MVC .Net unobtrusive validationMVC .Net 中的嵌套字段表单验证不显眼的验证
【发布时间】:2016-01-04 01:02:03
【问题描述】:

此代码正确验证:

@Html.LabelFor(m => m.FirstName, new { @class = "control-label col-md-2 required" })
<div class="col-md-4">
    @Html.EditorFor(m => m.FirstName, new { @class = "form-control" })
    @Html.ValidationMessageFor(m => m.FirstName)
</div>

此代码未正确验证:

@Html.LabelFor(model => model.User.FirstName, new { @class = "control-label col-md-3 required" })
<div class="col-md-8">
    @Html.EditorFor(model => model.User.FirstName, new { @class = "form-control required" })
    @Html.ValidationMessageFor(m => m.User.FirstName)
</div>

第二块代码中的model.User与第一块代码中的“m”是同一类型的对象。

这是模型中显示自定义验证器属性的块。

[DisplayName("First Name")]
[Required()]
[FirstLastName]
public string FirstName{ get; set; }

这是 FirstLastName 属性,它适用于第一段代码,但不适用于第二段。

public class FirstLastNameAttribute : RegularExpressionAttribute
{
    public FirstLastNameAttribute() :
        base(@"^[A-Za-z0-9\.\-_\!\#\^\~ ]{1,31}(?<!\.)$")
    {
        ErrorMessageResourceName = "FirstLastNameErrorMessage";
        ErrorMessageResourceType = typeof(Messages);
    }
}

正常工作的第一段代码的 HTML 输出

<input class="input-validation-error text-box single-line form-control" data-val="true" data-val-regex="Allowed characters: a-Z, 0-9, .-_!#^~, and space.  Cannot end with a period.  Must be 1-32 characters." data-val-regex-pattern="^[A-Za-z0-9\.\-_\!\#\^\~ ]{1,31}(?<!\.)$" data-val-required="The First Name field is required." id="FirstName" name="FirstName" type="text" value="asdf." aria-required="true">

无法正常工作的第二段代码的 HTML 输出

<input type="text" value="" name="User.FirstName" id="User_FirstName" data-val-required="The First Name field is required." data-val-regex-pattern="^[A-Za-z0-9\.\-_\!\#\^\~ ]{1,31}(?&lt;!\.)$" data-val-regex="Allowed characters: a-Z, 0-9, .-_!#^~, and space.  Cannot end with a period.  Must be 1-32 characters." data-val="true" class="text-box single-line form-control" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVQ4EaVTO26DQBD1ohQWaS2lg9JybZ+AK7hNwx2oIoVf4UPQ0Lj1FdKktevIpel8AKNUkDcWMxpgSaIEaTVv3sx7uztiTdu2s/98DywOw3Dued4Who/M2aIx5lZV1aEsy0+qiwHELyi+Ytl0PQ69SxAxkWIA4RMRTdNsKE59juMcuZd6xIAFeZ6fGCdJ8kY4y7KAuTRNGd7jyEBXsdOPE3a0QGPsniOnnYMO67LgSQN9T41F2QGrQRRFCwyzoIF2qyBuKKbcOgPXdVeY9rMWgNsjf9ccYesJhk3f5dYT1HX9gR0LLQR30TnjkUEcx2uIuS4RnI+aj6sJR0AM8AaumPaM/rRehyWhXqbFAA9kh3/8/NvHxAYGAsZ/il8IalkCLBfNVAAAAABJRU5ErkJggg==&quot;); background-repeat: no-repeat; background-attachment: scroll; background-position: right center; cursor: auto;" aria-required="true">

嵌套对象验证有问题吗?有没有简单的解决方法?

【问题讨论】:

  • 您显示的内容没有任何问题 - [Required] 属性可以正常工作。但是你还没有说明[FirstLastName] 是什么或做什么。
  • @StephenMuecke 我已经添加了 FirstLastNameAttribute 的代码。它适用于第一位代码,但不适用于第二位。所需属性适用于两组代码。
  • 对我来说非常好用。显示两种情况的 html 输出。
  • @StephenMuecke 我已将输出添加到问题的底部。
  • 两者都不适用于[FirstLastName],因为两者都不会生成必要的data-val-regex=".."data-val-regex-pattern=".." 属性。我假设是因为您尚未在 Global.asax 中注册该属性

标签: .net asp.net-mvc-3 unobtrusive-validation


【解决方案1】:

所以我弄清楚了为什么它不起作用。

出于某种原因(我不明白为什么,所以如果有人可以解释,请这样做,我会更改接受的答案)在 Required 属性破坏它之后有括号“()”。删除括号后,一切正常。

[DisplayName("First Name")]
[Required]
[FirstLastName]
public string FirstName{ get; set; }

由于我使用的正则表达式,它也不起作用。它不喜欢反向查找(?&lt;!\.) 部分。因此,在删除它后,它就起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2016-02-19
    相关资源
    最近更新 更多