【问题标题】:Unrequired property keeps getting data-val-required attribute不需要的属性不断获取 data-val-required 属性
【发布时间】:2011-01-15 14:45:03
【问题描述】:

这是经过验证的模型:

[MetadataType(typeof(TagValidation))]
public partial class Tag
{
}

public class TagValidation
{
        [Editable(false)]
        [HiddenInput(DisplayValue = false)]
        public int TagId { get; set; }

        [Required]
        [StringLength(20)]
        [DataType(DataType.Text)]
        public string Name { get; set; }
    //...
}

这是视图:

    <h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Tag</legend>

        <div>@Html.EditorForModel()</div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

这是得到的渲染:

<form action="/Tag/Create" method="post">
    <fieldset>
        <legend>Tag</legend>
        <div><input data-val="true" data-val-number="The field TagId must be a number." data-val-required="The TagId field is required." id="TagId" name="TagId" type="hidden" value="" />

        <div class="editor-label"><label for="Name">Name</label></div>
        <div class="editor-field"><input class="text-box single-line" data-val="true" data-val-length="The field Name must be a string with a maximum length of 20." data-val-length-max="20" data-val-required="The Name field is required." id="Name" name="Name" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span></div>            
    ...
    </fieldset>
</form>

问题是生成了 TagId 验证,尽管 TagId 属性上没有设置必需的属性。因此,我什至无法通过客户端验证以在数据库中创建新标签。 我错过了什么?

【问题讨论】:

    标签: asp.net-mvc jquery-validate


    【解决方案1】:

    我找到了答案。只需将此添加到Application_Start

    DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
    

    【讨论】:

    • 谢谢。也拯救了我的一天。在我看来,这是一种倒退行为。 False 应该是默认值。
    • @frnnky 我添加了这个,但它没有解决link我的问题。你能帮帮我吗?谢谢
    • 也拯救了我的一天!!!即使不添加这个,流利的验证也无法正常工作!
    • 有什么方法可以改变RequiredAttribute的隐式使用,而不是简单地禁用这个功能?
    • 亲爱的耶稣,这个设置怎么不是默认的。浪费了一个小时
    【解决方案2】:

    使视图模型值类型可以为空。那么默认情况下它们不会是必需的。

    还请注意,如果您将属性 'required="false"' 放在 html 5 中(如果您在 doctype 元数据中设置 html 5),它将看到“required”并使其成为必需。您可以使用 dojo-data-props="required:false"。

    【讨论】:

    • 为什么投反对票?使属性可为空是解决此问题的有效方法,而无需在 Application_Start 中进行系统范围的更改。
    • @StuartQ 我同意你的观点,所以我投了赞成票以取消反对票。使属性可为空是解决此问题的有效方法。它对我有用。
    • 绝对是更好的答案!我宁愿不进行系统范围的更改以在一个视图中解决一个问题。干杯
    【解决方案3】:

    frennky 的解决方案只删除了data-val-required,但就我而言,我仍然有data-val-numberdata-val

    我不得不将下面的两行添加到 Application_Start 以摆脱一切。

    ModelValidatorProviders.Providers.Clear();
    ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
    

    【讨论】:

    【解决方案4】:

    问题是隐藏字段的值为空。如果您使用整数类型,则不应发生这种情况。我想 TagId 属性在Tag 类中定义为可空类型。所以要么在渲染视图之前给它赋值,要么使用整数类型:

    [MetadataType(typeof(TagValidation))]
    public partial class Tag
    {
        public int TagId { get; set; }
        public string Name { get; set; }
    }
    

    使生成的隐藏字段如下所示:

    <input 
        data-val="true" 
        data-val-number="The field TagId must be a number." 
        data-val-required="The TagId field is required." 
        id="TagId" 
        name="TagId" 
        type="hidden" 
        value="0" 
    />
    

    通常不应为此隐藏字段触发客户端验证。

    【讨论】:

    • 首先,TagId 不能为空,它只是 int。其次,标记是由 html 助手 EditorForModel 生成的,所以我无法控制它。要将值设置为 0,我想我可以发送一个空的 Tag 实例来创建页面,但这不是我正在寻找的解决方案。
    【解决方案5】:

    jquery 验证目标检查“禁用”html 属性。

    $(function () { 
      $("#TagId").attr("disabled", "disabled") 
    });
    

    或使用 Nullable。

    希望有这个代码!

    【讨论】:

      【解决方案6】:

      使用 MVC4 你也可以使用这个:

      @{ Html.EnableClientValidation(false); }
      @Html.EditorForModel()
      @{ Html.EnableClientValidation(true); }
      

      【讨论】:

        【解决方案7】:

        使您的模型或视图模型属性值类型为“nullabel”。这将解决您的问题。从您的标签中删除“必需”属性的重要一件事,否则它将需要我“必需”

        例子:-

        public class ViewModle
        {
            public int? foo{get;set;}
        }
        

        这里的例子中 foo 是整数可以为空的类型,这在 mvc 中将不再需要。

        希望这会对你有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-19
          • 1970-01-01
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          相关资源
          最近更新 更多