2016-08-04 2 views
1

による力の真/偽の選択フィールドがNULL可能ブール型であり、ラジオボタンは、クライアント側の検証がによって強制することができますどのようにMVCの検証 - のNullableブール - MVCアプリケーション</p> <p>でラジオボタン

を設定として提示され現状では、データ属性の設定

クライアント側の検証は(jqueryの邪魔にならない)

使用されている、私はラジオボタンとしてユーザーに提示するNULL可能boolsをテンプレート化しています。 True、False、nullの3つのラジオボタンがあります。

nullラジオボタンが非表示になっているため、ユーザーはtrueまたはfalseオプションから選択する必要があります(nullは有効なオプションではなく、nullはユーザーがまだ選択していないことを意味します)。 )

を選ばなければならない私は、私は他の場所で

[Range(typeof(bool), "false", "true", ErrorMessage = "You must make a selection")] 

同じ質問への答えとして見つかりましたが、これは検証

を渡したことがない私は、単に

を試してみましたことを、次のを試してみました
[Required] 

が、これは

さらに情報をユーザーに選択させることがありません: -

問題がときBOOL存在するように見えますか?ラジオボタンとして表示されます。 boolのMVCデフォルトテンプレートを使用している場合は、 ( "Not Set"、 "True"、 "False"の3つのオプションを持つドロップダウンリストです)

ラジオボタンとして表示される場合、ラジオボタンは機能し、正しい状態を。データベースが、検証が動作しません

例コード

モデル: -

public class SomeModel 
{ 
    [Required] 
    public string Name { get; set; } 

    [Required] 
    public bool? SomeBool { get; set; } 
} 

ビュー: -

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.SomeBool) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.SomeBool) 
      @Html.ValidationMessageFor(model => model.SomeBool) 
     </div> 

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

    </fieldset> 
} 

boolにはエディタテンプレートは設定されず、ラジオボタンには設定されません。

ラジオボタンテンプレート: - 問題は、クライアント側の検証データは、ラジオボタン

+0

'[必須]属性を追加するだけで、ユーザーは' true'または 'false'を選択する必要があります。あなたのために働いていない場合は、あなたが示していないコードに他の問題があります。 –

+0

boolには、trueまたはfalseの2つの値しか持たないようにしてください。 3つの値が必要な場合は、列挙型または文字列を使用できます。私は個人的に、このような状況ではboolが間違ったデータ型であると考えています。ただ私の意見 –

+0

私は3つの値が欲しいわけではありません。私は真実か偽りしか望んでいない。 boolはnullであるため、falseとユーザがまだ何も選択していないことに違いがあります。ユーザーはtrueまたはfalseのみを選択する必要があります。 nullを指定することができない場合、falseがデフォルトになります。したがって、ユーザーに選択を強制することはできません。 – user2437066

答えて

1

のために作成されていない属性に関連されようとしている

@model bool? 
<div> 
    @{ 
     Dictionary<string, object> yesAttrs = new Dictionary<string, object>(); 
     Dictionary<string, object> noAttrs = new Dictionary<string, object>(); 
     Dictionary<string, object> nullAttrs = new Dictionary<string, object>(); 

     yesAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes"); 
     noAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No"); 
     nullAttrs.Add("id", ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA"); 

     if (Model.HasValue && Model.Value) 
     { 
      yesAttrs.Add("checked", "checked"); 
     } 
     else if (Model.HasValue && !Model.Value) 
     { 
      noAttrs.Add("checked", "checked"); 
     } 
     else 
     { 
      nullAttrs.Add("checked", "checked"); 
     } 
    } 

    @Html.RadioButtonFor(x => x, "true", yesAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label> 
    @Html.RadioButtonFor(x => x, "false", noAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label> 
    <span style="display: none"> 
     @Html.RadioButtonFor(x => x, "null", nullAttrs) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label> 
    </span> 
</div> 

あなたは、この目的のために、あなたの小さな属性を記述することができます:

public class TrueFalseBoolAttribute: ValidationAttribute 
{ 
    public override bool IsValid(Object value) 
    { 
     return value is bool; 
    } 
} 

これはうまくいくはずです。しかし、3つの選択肢がある場合は、Enumにするのが最善の方法だと思います。

0

モデル:

public bool? boolObj { get; set; } 
public int intObj { get; set; } 

ビュー:

<input data-val="true" data-val-required="The boolObj field is required." id="boolObj " name="boolObj " type="text" value="False"> 
<input data-val="true" data-val-number="The field intObj must be a number." data-val-required="The intObj field is required." id="intObj " name="intObj " type="text" value="0"> 

NULL可能ブール値は、検証属性を持っていない:あなたはページ上で何が起こるかビューのソースから見ることができます

@Html.TextBoxFor(p => p.boolObj) 
@Html.TextBoxFor(p => p.intObj) 

ブールはdata-val-requiredタグを持っています。 intはdata-val-requiredタグとdata-val-number attribute

を持っていますもちろん、チェックボックス(チェックボックスのみ)またはチェックされない(false)ので、必要なタグはそれほど使用されないので、かなり冗長です。

関連する問題