web-dev-qa-db-ja.com

不要なプロパティがdata-val-required属性を取得し続ける

これは検証されたモデルです:

[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プロパティにRequired属性が設定されていないことです。そのため、dbに新しいタグを作成するためにクライアント側の検証に合格することさえできません。私は何が欠けていますか?

53
frennky

答えを見つけました。これをApplication_Startに追加するだけです:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
99
frennky

View-model value-typesをヌル可能にします。その後、それらはデフォルトでは必須ではありません。

また、html 5に属性 'required = "false"'を指定した場合(doctypeメタデータにhtml 5を設定した場合)、「required」が表示され、必須になります。 dojo-data-props = "required:false"を使用できます。

22
Curtis Yallop

frennkyのソリューションはdata-val-requiredしかし、私の場合、私はまだdata-val-numberおよびdata-val

Application_Startに以下の2行を追加して、すべてを削除する必要がありました。

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

問題は、非表示フィールドの値が空であることです。整数型を使用している場合、これは発生しません。 TagIdプロパティはTagクラスのnull許容型として定義されていると思います。したがって、ビューをレンダリングする前に値を割り当てるか、整数型を使用します。

[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" 
/>

また、通常、この非表示フィールドに対してクライアント側の検証はトリガーされません。

3
Darin Dimitrov

jqueryは、ターゲットチェック「無効」html属性を検証します。

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

またはNullableを使用します。

このコードを願っています!

3
takepara

MVC4では、これも使用できます。

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

ModelまたはView-Modelプロパティの値タイプを「nullabel」にします。これはあなたの問題を解決します。タグから「必須」属性を削除する重要なこと

例:-

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

この例では、fooはNULL可能な整数型です。これはmvcでは不要になります。

これがお役に立てば幸いです。

0
Jani Devang