2017-07-30 46 views
0

我有与BLL模型密切相关的ViewModel。所以现在我有:漫步,为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> 

现在我想能够使用视图模型也显示其他数据,所以我想做到这一点:

public class PanelViewModel 
{ 
    [Required] 
    public string LeftSideOfPanel { get; set; } 
    public int RightSideOfPanel { 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.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接口,然后用验证相应

0

验证属性在某种意义上是不错的,该模型状态在绑定自动更新的ViewModels,但请注意,它们是完全可选的。您可以自行执行验证,而不是依赖于自动验证,每次都基于不同的规则。

在这个管道中,这完全是等价的 - 无论如何添加错误(通过基于属性的自动验证或基于任何您想要的手动验证),您的视图都将显示模型错误。

我的建议则是,而不是试图分配验证动态属性,只需跳过此,并有自己的验证代码,添加错误就像基于属性的引擎会自动将它们添加:

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

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

其中key将引用您的模型属性。