Asp.net mvc Unrequired属性不断获取数据val required属性

Asp.net mvc Unrequired属性不断获取数据val required属性,asp.net-mvc,jquery-validate,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] [Stri

这是带有验证的模型:

[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>
创建
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
标签
@Html.EditorForModel()

} @ActionLink(“返回列表”、“索引”)
下面是get的renderd:

<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中创建新标记。
我遗漏了什么?

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


通常情况下,此隐藏字段不应触发客户端验证。

我找到了答案。只需将此添加到
应用程序\u Start

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

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

$(function () { 
  $("#TagId").attr("disabled", "disabled") 
});
或者使用Nullable


希望这个代码

使视图模型值类型可为空。那么默认情况下就不需要它们了


另外请注意,如果将属性'required=“false”'放在HTML5中(如果在doctype元数据中设置HTML5),它将看到“required”,并将其设置为required。您可以使用dojo data props=“required:false”。

frennky的解决方案只删除了
所需的数据值
,但在我的情况下,我仍然有
数据值编号
数据值

我不得不在应用程序开始时添加下面的两行,以摆脱一切

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

有了MVC4,您还可以使用:

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

使模型或视图模型属性值类型为“nullabel”。这将解决您的问题。重要的一点是从标记中删除“required”属性,否则它将使用i“required”

例如:-

public class ViewModle
{
    public int? foo{get;set;}
}
在这里的例子中,foo是整数可为null的类型,在mvc中不再需要它


希望这能对您有所帮助。

首先,TagId不是空的,它只是int。其次,标记是由html助手EditorForModel生成的,所以我无法控制它。要将值设置为0,我想我可以发送一个空的标记实例来创建页面,但这不是我要寻找的解决方案。谢谢。也救了我一天。在我看来,这是倒退的行为。False应该是默认值。@frnky我添加了这个,但它没有解决我的问题。请你帮帮我好吗。谢谢你也救了我一天!!!即使不添加此项,fluent验证也无法正常工作!!有没有办法改变
RequiredAttribute
隐式使用的内容,而不是简单地禁用此功能?天哪,此设置怎么不是默认设置。浪费了一个小时this@nuander值得关注。这就像是用大锤敲开坚果。这里有一个更简单的答案对我有效为什么要投否决票?使属性可为null是解决此问题的有效方法,而不必在应用程序_Start中进行系统范围的更改。@StuartQ我同意你的意见,所以我对它投了赞成票以删除反对票。使属性可为null是解决此问题的有效方法。这对我很有效。绝对是更好的答案!我不希望为了从一个角度解决一个问题而进行全系统的更改。干杯