2011-02-03 10 views
6

おはようございます私はドロップダウンリストの値の検証に関する質問があります。 ReservationDataというビューモデルタイプにバインドされたビューがあります。ASP.NET MVC 3 - 検証の質問

このオブジェクトには、タイプList<VehicleData>CustomerVehiclesというプロパティが含まれています。 VehicleDataは、2つのintプロパティVehicleMakeIdVehicleModelIdを持っています。

私はCustomerVehiclesコレクション内のアイテムの数をループし、それぞれに2つのドロップダウンを表示しようとしています。車両のドロップダウンとDropDownListForを使用した車両モデルのドロップダウンを表示しています。

私が送信して検証しようとすると、画面に表示される検証エラーは表示されません。

私はValidationMessageForを各ドロップダウンリストに追加していますか?私はこれが私のビューモデルの構造とその複雑さと、コントロールの名前付けの必要性やIDの設定方法に問題があるかどうかはわかりません。どんな助けでも大歓迎です。

ここ

コレクションをループ用のコードです:

@for (var i = 0; i < Model.CustomerVehicles.Count(); i++) 
    { 
     var vehicleNumber = i + 1; 
     <div class="vehicle-selection-wrapper"> 
      <div class="content-container"> 
       <h3> 
        Vehicle @vehicleNumber</h3> 
       <img class="vehicle-image" alt="manufacturer image" src="@Url.Content("~/Content/images/default-vehicle.gif")" /><br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleMakeId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
          , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" })<br /> 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleMakeId)<br /> 
       @Html.LabelFor(m => m.CustomerVehicles[i].VehicleModelId) 
       @Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleModelId 
      , new SelectList(new List<CWR.Domain.VehicleModel>(), "Id", "Name") 
       , @UIDisplay.Dropdown_DefaultOption, new { @class = "long-field" }) 
       @Html.ValidationMessageFor(m => m.CustomerVehicles[i].VehicleModelId) 
      </div> 
     </div> 
    } 

[OK]をので、私はまた、生成されたHTMLで生成された選択は、要素に関連付けられているHTML5データ-valの属性が欠落していることに気づきました検証を処理する。ここで生成されたHTMLに私VehicleDataクラスでさらに

<select class="long-field" id="CustomerVehicles_0__VehicleMakeId"   name="CustomerVehicles[0].VehicleMakeId"><option value="">-- Select --</option> 
</select><br /> 
<span class="field-validation-valid" data-valmsg- for="CustomerVehicles[0].VehicleMakeId" data-valmsg-replace="true"></span><br /> 
<label for="CustomerVehicles_0__VehicleModelId">Model</label> 
<select class="long-field" id="CustomerVehicles_0__VehicleModelId" name="CustomerVehicles[0].VehicleModelId"><option value="">-- Select --</option> 
</select> 
<span class="field-validation-valid" data-valmsg-for="CustomerVehicles[0].VehicleModelId" data-valmsg-replace="true"></span> 

VehicleMakeIdVehicleModelIdプロパティはRequired属性で装飾されています。

UPDATE:

[OK]をので、私はテストし、私はその後、Html.TextboxFor呼び出し検証作品とHtml.DropdownListFor通話を入れ替える以外の同一の私のコードを続ければことに気づきました。これを引き起こす原因は何ですか?それは邪魔にならない検証のフレームワークのバグでしょうか?

UPDATEは:

を修正含まれるようASP.NET Forumsにこの同じ質問を投稿した後、私は解決策を得ることができました。この記事では、控えめな検証フレームワークにバグがあり、ドロップダウンリストの検証をどのように処理するかを確認することができます。この問題を回避する上で、あるいは少なくともMicrosoftがフレームワークに修正を加えるまで、他の人がこの問題を回避するのに役立つ解決策(サンプルコードを含む)と同様に、問題を説明するうえで、ユーザーカウンセリングはうまく機能します。

ご協力いただきありがとうございます。

+0

あなたは、ビュー内で、このカスタムヘルパーを使用する方法の例を持っていますか?ありがとう。 – Brandon

答えて

0

まず、ビューモデルのプロパティにデータアノテーションを追加して、検証メッセージが表示されるようにしてください。

あなたは

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx

または必要に応じてカスタムのものを作成し、ここで必要なものを見つけるかもしれません。

は、まさにあなたが検証する必要がありますか?

+0

ちょうどあなたが<%Html.EnableClientVAlidation()の追加のような、ビューの検証を行う方法についてのパターンを修正するために続くかどうかを確認したいです。 %>と必要なjavascriptsが含まれていますか? – michaelalm

+0

@mreyeros - 投稿を編集してコードを投稿してください。本当にここでは読めません。私は現在、ASP.NET MVC 2のみを使用していますが、ASP.NET MVC 3(RAZOR/ubostrusive ajaxなど)には馴染みがありません。うまくいけば、あなたの投稿をきれいにすることができるなら、ごめんなさい – michaelalm

2

私もMVC 3でdropdownlistsでこれは明らかに巨大な監督に関するクライアント側の検証に遭遇していると私が提供できる最善の解決策が見つからないHMTLは自分の属性置くことです。あなたのビューモデルで

は次のようにプロパティを作成します。

public Dictionary<string, object> CustomerVechicleAttributes 
    { 
     get 
     { 
      Dictionary<string, object> d = new Dictionary<string, object>(); 
      d.Add("data-val", "true"); 
      d.Add("data-val-required", "Please select a Vechicle."); 
      return d; 
     } 
    } 

は、次に、あなたのコード内で、ちょうどあなたのドロップダウンリストにhtmlAttributesとしてModel.CustomerVechicleAttributesを追加

@Html.DropDownListFor(m => m.CustomerVehicles[i].VehicleMakeId 
      , new SelectList(Model.VehicleMakes, "Id", "Name") 
      , @UIDisplay.Dropdown_DefaultOption, 
      **Model.CustomerVechicleAttributes** }) 

を入力してください。 これは、欠落している必要な属性を挿入します。もちろん、クラス属性のように必要な他の属性を追加する必要があります。

これが役に立ちます。

0

私はフィールドが正しくTextBoxForではなくDropDownListForで検証ばかりでまったく同じ問題を抱えていました。

@Html.DropDownListFor(m => m.PaymentTO.CreditCardType, Model.CreditCardTypeList, "Select Card Type", new { style = "width:150px;" }) 

私は同じページで作業別DropDownListForを持っていたので、私はそれが一般的なDropDownListForの問題ではなかったことを知っていました。複雑なモデルもあり、親オブジェクトのPaymentTOは初期化されていません。私がviewTO.PaymentTO = new PaymentTO()を設定すると、コントローラでは、DropDownListForの検証が機能し始めました。 DropDownListForにはおそらく問題がありますが、修正プログラムはコントローラ内のオブジェクトを初期化するだけの簡単な方法です。

2

data-val-*-*の属性をHtmlAttributesに追加すると、ビュー内にこれが最も簡単な方法で表示されます。

 @Html.DropDownListFor(m => m.yourlistID, (IEnumerable<SelectListItem>)ViewBag.YourListID, String.Empty, 
     new Dictionary<string, object>() { { "data-val", "true" }, 
     { "data-val-remote-url", "/Validation/yourremoteval" }, 
     { "data-val-remote-type", "POST" }, { "data-val-remote-additionalfield", "youradditionalfieldtovalidate" } }) 

私はそれが役立つことを願って:あなたは、リモート検証を必要とするだけでdata-val-remote-*を含む要素を削除しない場合は、以下の方法では、あまりにもRemoteValidationで動作します。宜しくお願いします!