2017-07-30 5 views
0

私はViewModelがBLLモデルに密接に関連しています。だから今私が持っている:MVCのViewModelに属性を動的に割り当てるために歩き回る

public class CarViewModel 
{ 
    [Required] 
    public string Colour { get; set; } 
    public int MaxSpeed { get; set; } 
} 

それは、シンプルなパネルとしてページに表示されます。

<div class="card"> 
<div class="card-content"> 
    <form method="post" class="col s12" id="sim_house_seeker"> 
     <div class="row"> 
      <div class="input-field col s6"> 
       <i class="material-icons prefix">phone</i> 
       @Html.TextBoxFor(m => m.Colour) 
       @Html.LabelFor(m => m.Colour) 
      </div> 
      <div class="input-field col s6"> 
       <i class="material-icons prefix">credit_card</i> 
       @Html.TextBoxFor(m => m.MaximalPrice) 
       @Html.LabelFor(m => m.MaximalPrice) 
      </div> 
     </div> 
     <button type="submit" class="waves-effect waves-light btn-large">Save</button> 
    </form> 
    <div class="clearBoth"></div> 
</div> 

今私はViewModelには、別のデータを表示行うことを使用できるようにしたいので、私なり

public class PanelViewModel 
{ 
    [Required] 
    public string LeftSideOfPanel { get; set; } 
    public int RightSideOfPanel { get; set; } 
} 

とのViewModel:

これを実行したいと思います210
<div class="card"> 
<div class="card-content"> 
    <form method="post" class="col s12" id="sim_house_seeker"> 
     <div class="row"> 
      <div class="input-field col s6"> 
       <i class="material-icons prefix">phone</i> 
       @Html.TextBoxFor(m => m.LeftSideOfPanel) 
       @Html.LabelFor(m => m.LeftSideOfPanel) 
      </div> 
      <div class="input-field col s6"> 
       <i class="material-icons prefix">credit_card</i> 
       @Html.TextBoxFor(m => m.RightSideOfPanel) 
       @Html.LabelFor(m => m.RightSideOfPanel) 
      </div> 
     </div> 
     <button type="submit" class="waves-effect waves-light btn-large">Save</button> 
    </form> 
    <div class="clearBoth"></div> 
</div> 

これは私が望む任意のモデルでそのパネルを使用することができ、ViewModelとBLLエンティティを分離します。しかし、私の問題は、ViewModelにバリデーションアトリビュートを追加することです。これはモデルによって異なる場合があります。私は属性を動的に追加することは不可能であることを知っていますので、この問題の最善の策は何ですか?

答えて

0

ビューモデルは、より密接としてのビューに関連付けられているビジネス層に比べて、あなたはpanelviewmodelインターフェイスを作成することができ、その後の検証でのviewmodels応じ

0

検証属性は、モデル状態が結合した際に自動的に更新されるという意味でいいです、ただし、それらは完全にオプションです。自動検証に頼るのではなく、毎回違うルールに基づいて独自の検証を実行できます。

これは完全に同等です。ビューにはエラーの追加方法に関係なく、モデルエラーが表示されます(属性に基づく自動検証または必要に応じた手動検証による)。

私がその後、示唆することは代わりに検証が動的属性を代入しようとの、ちょうどこのをスキップし、自動的にそれらを追加するのと同じ属性ベースのエンジンのようなエラーを追加し、独自の検証コードを持っていることです。

public ActionResult Foo(YourModel model) 
{ 
    // manual validation 
    if (...) 
     ModelState.AddModelError(key, error); 

    if (ModelState.IsValid) // this works too 
     ... 

ここで、keyはあなたのモデルプロパティを参照します。

関連する問題