1

これを行うには、ここで概説したアプローチに従っています。

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

これで分かりやすくなるかも

これは私のドロップダウンです。ユーザーが何もしなかったと仮定して、「選択してください」が選択されています。

  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 は値 false を 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.Isvalid が false になるため、from がメッセージとともにリロードされます。値 'Please Select' は無効です。これを停止するにはどうすればよいですか?また、「値を選択してください」という xVal 駆動の検証方法をどのようにすればよいですか?

4

2 に答える 2

1

ユーザーが値を選択せず​​にfalseを推測できるようにする場合は、デフォルトの選択に値0を指定します。これにより、ユーザーが値を選択しなくても値が送信され、必須属性が送信されます。満足すること。

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

編集:あなたのコメントに基づいて、jQuery検証のようなクライアント側検証プラグインを使用したクライアント側検証を提案します。これにより、ほとんどの場合、実際にリクエストを投稿しなくても、適切なエラーメッセージを表示できます。サーバー側で、ModelStateが無効であり、その特定のフィールドが無効である場合は、エラーメッセージをより適切なものに置き換えます。バインディングフレームワークに対応するためだけにモデルを変更することはお勧めしません。

于 2009-04-28T18:59:08.747 に答える
1

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

于 2009-04-29T22:24:38.133 に答える