2009-08-11 130 views
5

我有Linq-to-Sql中的模型类,部分类标有数据标注属性和对xVal的引用。ASP.NET MVC模型/ ViewModel验证

当我直接将视图绑定到模型时,一切都很好,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始终为真。

我可以通过视图模型的属性拉数据注释拉这样的验证,或者我应该这样做另一种方式?

+0

请在此标记回答,如果它回答了您的问题 – 2011-09-08 13:45:39

回答

0

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

它需要实体和前缀,所以我不明白为什么视图模型中的结构应该有所作为。喜欢的东西:

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

詹姆斯

+0

我没有在我面前的确切代码,但我有类似于<%= Html.ClientSideValidation ()%>,这适用于它是。由于服务器端的IsValid调用无法正常工作,所以我认为它的注释问题不是xval问题,但可能是错误的。 – blu 2009-08-11 16:23:21

4

如果您使用的谐音,并传入亚型,你仍然需要资格。见如下:

<%@ 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> 

<% } %> 

注意,类型是订单明细,但是我仍然认为前缀处理验证消息。

+1

我遇到了同样的问题。 – hminaya 2009-11-19 13:13:06

0

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

为了使它与xval一起工作,您需要将DataAnnotations放置在视图模型属性中。据我所知,从xvals代码中可以看出,它没有超出公共财产的任何验证信息(有人请纠正我,如果我在这里错了)。

如果你想使你的模型之间的验证透明和视图模型,你可以下去用postsharp绑定属性的途径,但是这可能是有点收获了很多的工作,如果你的程序是很小的。