四处走动,为MVC中的ViewModel动态分配属性

时间:2017-07-30 16:54:24

标签: c# asp.net-mvc

我有与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添加了验证属性,这些属性可能在模型中有所不同。我知道无法动态添加属性,因此这个问题的最佳解决方法是什么?

2 个答案:

答案 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将引用您的模型属性。