繁体   English   中英

ASP.NET MVC模型/ ViewModel验证

[英]ASP.NET MVC Model/ViewModel Validation

我在Linq-to-Sql中有模型类,其中部分类标有数据注释属性和对xVal的引用。

当我将视图直接绑定到模型时,一切都很好,xVal生成的JS和服务器端双重检查。

我的许多视图都没有输入到一个特定的模型,所以我正在设置视图模型类。 我没有公开整个模型实例,而是将属性暴露给我允许/需要由视图设置的模型。

// foo model 
public class Foo {
    public string FooField { ... }
    public Bar Bar { ... }
}

// bar model, where bar is a parent relationship of foo in the db
public class Bar {
    public string BarField { ... }
}

// view model stuff
public class FooViewModel {
    private Foo foo;

    public FooViewModel() {
        foo = new Foo() { Bar = new Bar() };
    }

    public Foo Model {
        get { return foo; }
        set { foo = value; }
    }

    public string BarField { 
        get { return foo.Bar.BarField; }
        set { foo.Bar.BarField = value; }
    }

    public string ExtraViewModelField {
        get; set; 
    }
}

此方法正确填充视图模型类,并且存储库可以正确填充记录。

但它根本没有通过验证。 我查看了发出的客户端代码,验证数组对于xval是空的。 此外,IsValid的服务器端检查始终为true。

我是否可以通过视图模型的属性来获取数据注释以进行验证,或者我应该以另一种方式执行此操作?

如果您使用partials并传入子类型,则仍需要限定。 见如下:

<%@ Control Language="C#" 
                   Inherits="System.Web.Mvc.ViewUserControl<MvcWeb.Models.OrderDetail>" %>

<% using (Html.BeginForm()) { %>

    <fieldset>
        <legend>Fields</legend>
            <%= Html.Hidden("OrderId", Model.OrderId) %>
            <%= Html.Hidden("ProductId", Model.ProductId)%>
        <p>
            <label for="Quantity">Quantity:</label>
            <%= Html.TextBox("OrderDetails.Quantity", Model.Quantity)%>
            <%= Html.ValidationMessage("OrderDetails.Quantity", "*") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

请注意,类型是OrderDetails,但我仍然在前面处理验证消息。

你可以发布你的xval帮助程序代码和一些你的Html.Helpers吗?

它需要实体和前缀,所以我不明白为什么视图模型中的结构应该有所不同。 就像是:

<%= Html.ClientSideValidation<Foo>("Foo") %>
<%= Html.ClientSideValidation<Bar>("Foo.Bar") %>

詹姆士

如果我正确读取了这个,你将把linq上的DataAnnotations放到sql类中,然后用你的linq到sql类填充你的viewmodel属性。

要使其与xval一起使用,您需要将DataAnnotations放在视图模型属性上。 至于我从xvals代码可以看出,它不会超出公共属性的任何验证信息(有人请纠正我,如果我错了)。

如果你想让你的模型和视图模型之间的验证透明,你可以沿着使用postharp来绑定属性的路线,但如果你的程序很小,这可能会带来很多好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM