不需要的属性不断获取data-val-required属性

时间:2011-01-15 14:45:03

标签: asp.net-mvc jquery-validate

这是带有验证的模型:

[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属性上设置必需属性。因此我甚至无法通过客户端验证来在db中创建新的Tag。 我错过了什么?

7 个答案:

答案 0 :(得分:98)

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

即可
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

答案 1 :(得分:21)

使视图模型值类型可以为空。然后默认情况下不会要求它们。

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

答案 2 :(得分:4)

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

我必须将以下两行添加到Application_Start中以摆脱一切。

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

答案 3 :(得分:3)

问题是隐藏字段的值为空。如果使用整数类型,则不应该发生这种情况。我想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" 
/>

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

答案 4 :(得分:3)

jquery验证目标cheking“disabled”html属性。

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

或使用Nullable。

希望这段代码!

答案 5 :(得分:2)

使用MVC4,你也可以使用它:

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

答案 6 :(得分:0)

制作模型或视图模型属性值类型&#34; nullabel&#34;。这将解决您的问题。一个重要的事情是删除&#34;必需&#34;来自您的标签的属性,否则将需要i&#34; required&#34;

实施例: -

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

这里的示例foo是整数可空类型,mvc中不再需要这样。

希望这会对你有所帮助。