6

私のASP.NET MVC 3アプリケーションでは、変わったことが起こり続けます。バリデーションアトリビュートなしで部分ビューが表示される(ASP.NET MVC 3)

jQuery Ajax APIを使用して挿入行をフェッチしていますが、問題はありません。しかし、必要なパーシャルビューを取得した時点で、検証属性がなくなり、これらの行の検証を再バインドできません。ここで

は、私はAjaxのレスポンスとして取得されるものです:

<input type="hidden" name="accommPropertyPeriods.index" autocomplete="off" value="84ddd0f5-a3e2-4f10-8e67-f32528c6393d" /> 
    <table style="width:100%;"> 
    <tr> 
     <td> 
      <div class="editor-field"> 
       <select class="chzn-select-deselect" data-placeholder="Choose an Alias..." data-val="true" data-val-number="The field AccommPropertySeasonPeriodAliasID must be a number." data-val-required="The AccommPropertySeasonPeriodAliasID field is required." id="accommPropertyPeriods_84ddd0f5-a3e2-4f10-8e67-f32528c6393d__AccommPropertySeasonPeriodAliasID" name="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].AccommPropertySeasonPeriodAliasID" style="min-width:100px;"><option value="302">A</option> 
<option value="303">B</option> 
<option value="304">C</option> 
<option value="305">D</option> 
</select> 
       <span class="field-validation-valid" data-valmsg-for="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].AccommPropertySeasonPeriodAliasID" data-valmsg-replace="false">*</span> 
      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" data-val="true" data-val-required="The PeriodStartsAt field is required." id="accommPropertyPeriods_84ddd0f5-a3e2-4f10-8e67-f32528c6393d__PeriodStartsAt" name="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodStartsAt" type="text" value="" /> 
       <span class="field-validation-valid" data-valmsg-for="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodEndsAt" data-valmsg-replace="false">*</span> 
      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" data-val="true" data-val-required="The PeriodEndsAt field is required." id="accommPropertyPeriods_84ddd0f5-a3e2-4f10-8e67-f32528c6393d__PeriodEndsAt" name="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodEndsAt" type="text" value="" /> 
       <span class="field-validation-valid" data-valmsg-for="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodEndsAt" data-valmsg-replace="false">*</span> 
      </div> 
     </td> 
    </tr> 
    </table> 

GUIDが同じである必要はありません。ここで

<input type="hidden" name="accommPropertyPeriods.index" autocomplete="off" value="ccaa15b3-76f1-4215-8bb5-a62d700bfc1e" /> 
    <table style="width:100%;"> 
    <tr> 
     <td> 
      <div class="editor-field"> 
       <select class="chzn-select-deselect" data-placeholder="Choose an Alias..." id="accommPropertyPeriods_ccaa15b3-76f1-4215-8bb5-a62d700bfc1e__AccommPropertySeasonPeriodAliasID" name="accommPropertyPeriods[ccaa15b3-76f1-4215-8bb5-a62d700bfc1e].AccommPropertySeasonPeriodAliasID" style="min-width:100px;"><option value="302">A</option> 
<option value="303">B</option> 
<option value="304">C</option> 
<option value="305">D</option> 
</select> 

      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" id="accommPropertyPeriods_ccaa15b3-76f1-4215-8bb5-a62d700bfc1e__PeriodStartsAt" name="accommPropertyPeriods[ccaa15b3-76f1-4215-8bb5-a62d700bfc1e].PeriodStartsAt" type="text" value="" /> 

      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" id="accommPropertyPeriods_ccaa15b3-76f1-4215-8bb5-a62d700bfc1e__PeriodEndsAt" name="accommPropertyPeriods[ccaa15b3-76f1-4215-8bb5-a62d700bfc1e].PeriodEndsAt" type="text" value="" /> 

      </div> 
     </td> 
    </tr> 
    </table> 

は私が取得する必要があるものです。私は、いわゆる非シーケンシャルバインディングを行っています。ここで

私は新しい挿入行を取得するためにjqueryのAJAXを通じて呼び出す午前アクションです:

[HttpPost] 
    public PartialViewResult accommPropertySeasonPeriodCreatePartialView(int id, int subid) { 

     //some other stuff going on here. non-related to partial view. 

     return PartialView("_AccommPropertySeasonPeriodCreatePartialView"); 
    } 

私はこれが起こっている理由を理解するために私の心の外にほとんどです。何か案が?

答えて

10

Html.TextBoxFor,Html.CheckBoxForなどのヘルパーは、フォーム内で使用される場合にのみ、検証属性を出力します。だから、Html.BeginFormコールでそれらをラップするようにしてください。クライアント側の検証に関しては、クライアントの検証を再適用するためにDOMを更新した後にjQuery.validator.unobtrusive.parseメソッドを呼び出す必要があります。そしてyet another article

あなたはカンニングと部分的に次のように置くことができ、フォーム持っていない場合:

@model MyViewModel 
@{ 
    ViewContext.FormContext = new FormContext(); 
} 
@Html.EditorFor(x => x.Foo) 

を今ヘルパーは、入力フィールドにデータ - *検証属性を出力します。

+0

oww、それは問題になるでしょう。私はすでに自分のプライマリビューでフォームを持っています。これを自動的に回避する他の方法、またはエディタテンプレートを上書きする必要がありますか? – tugberk

+0

@tugberkについては、部分的にFormContextを手動でインスタンス化する方法についての私の更新を参照してください。 –

+0

恐ろしい!完全に働いた。これを理解するだけで、この微妙な調整がフレームワーク(またはテンプレートエンジン)に入力フィールドのデータ*検証属性を出力することを理解できるようになりますか? – tugberk

関連する問題