2009-04-28 7 views
1

Imこれを行うには、approch outline hereに従います。ドロップダウンを伴うMVCとXVal - 'Please Select'の値が無効です

xvalを使用してドロップダウン選択を検証する際に問題がありますが、MVCバインディングでは操作が妥当性検査に合格するという間違ったことが推測されるようですが、modelstateはバインディング例外を保存してページを無効にします操作が無効なデータで実行されることが許可されているが、ページが無効であるため、ユーザーは検証が失敗したと考えられるようになります。

これが選択されているユーザーを想定し、これがダウン私のドロップである

それをより明確に何ので、「選択してください」なかったかもしれません。

Do you like cheese: 
    <select name="Favourites.Cheese"> 
     <option>Please Select</option> 
     <option value="1">Yes</option> 
     <option value="0">No</option> 
    </select> 
    <%=Html.ValidationMessage("Favourites.Cheese")%> 

これは、あまりにも、MVCはfav.cheeseする偽の値をマップの記事から、

public ActionResult Create(Favourites fav) 
{ 
      try 
      { 
       _favTask.Create(fav); 
      } 
      catch (RulesException ex) 
      { 
       ex.AddModelStateErrors(ModelState, "Favourites"); 
      } 

      if(!ModelState.IsValid) 
      { 
       //redirect back 
      } 
      //other stuff 
} 

プロパティが

pulic class Favourites 
    { 
     [Required] 
      public bool Cheese{get;set;} 
    } 

ませ例外を帰属されていないコントローラのアクションでスローされますfav.cheeseは値があるので

public int Create(Favourites fav) 
{ 

    var errors = DataAnnotationsValidationRunner.GetErrors(fav); 
    if (errors.Any()) 
     throw new RulesException(errors); 

     //create fav 
} 

しかし、コントローラのModelStateにフォーカスが戻ったときに、falseが返されるので、fromはメッセージでリロードされます。「Please Select」の値は無効です。どのように私は起こってからこれを停止するか、xValは "値を選択してください"の検証メソッドを駆動するのですか?

答えて

1

ユーザーが値を選択できず、偽を推測できるようにするには、デフォルトの選択に値0を指定します。この方法では、値1が選択されていなくても送信されます。 Required属性が満たされます。

<option value="0">Please Select</option> 

EDIT: - jQueryのvalidationのようなご意見をもとに、私は、クライアント側の検証プラグインを使用して、いくつかのクライアント側の検証を示唆しています。これにより、ほとんどの場合、実際にリクエストを送信することなく適切なエラーメッセージを表示できます。サーバー側で、ModelStateが無効で、その特定のフィールドが無効な場合は、エラーメッセージをより適切なものに置き換えます。私はバインディングフレームワークに対応するためにモデルを変更することを推奨しません。

+0

Mvcはこれをfalseにマップしますか?したがって、何かが選択されたように見えるでしょうか? – Dan

+0

私はあなたの質問を誤解しましたか?あなたは今、検証エラー "値"を選択してください "無効です"を取得し、エラーを停止したいと言った?代わりに何をしたいですか? – tvanfosson

+0

"値を選択してください"のようなメッセージを表示したいのですが、現在のメッセージはMVCバインディングの副産物であり、xvalの検証はできません。 – Dan

1

ブール値は値型なので、常に値を持ちます。したがって、[必須]は実際の効果はありません。 Nullable <ブール>を代わりに使用するとどうなりますか?これにより、最初のオプションが選択されている場合にMVCがnull値を割り当てることができ、Required属性はユーザーが実際に値を選択したことをアサートできます。

+0

これは役に立ちません。 – Dan

関連する問題