我有与BLL模型密切相关的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:
<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 :(得分:0)
与业务层相比,View Models与视图关系更紧密,您可以创建panelviewmodel接口,然后相应地使用验证视图模型
答案 1 :(得分:0)
验证属性在某种意义上很好,模型状态在绑定时自动更新,但请注意它们是完全可选的。您可以每次根据不同的规则自行执行验证,而不是依赖于自动验证。
在管道中这是完全等效的 - 您的视图将显示模型错误,无论如何添加错误(通过基于属性的自动验证或基于您想要的任何内容的手动验证)。
我建议的是,不要试图动态分配验证属性,而是跳过这个并拥有自己的验证代码来添加错误,就像基于属性的引擎会自动添加它们一样:
public ActionResult Foo( YourModel model )
{
// manual validation
if ( ... )
ModelState.AddModelError( key, error );
if ( ModelState.IsValid ) // this works too
...
其中key
将引用您的模型属性。