Asp.net mvc ASP.NET MVC模型/视图模型验证

Asp.net mvc ASP.NET MVC模型/视图模型验证,asp.net-mvc,validation,viewmodel,data-annotations,Asp.net Mvc,Validation,Viewmodel,Data Annotations,我在LINQtoSQL中有模型类,其中的部分类标记有数据注释属性和对xVal的引用 当我将一个视图直接绑定到一个模型时,一切都很好,xVal生成的JS和服务器端的双重检查都很好 我的许多视图不接受特定模型的输入,因此我正在设置视图模型类。我没有公开整个模型实例,而是将允许/需要由视图设置的属性公开到模型中 // foo model public class Foo { public string FooField { ... } public Bar Bar { ... } }

我在LINQtoSQL中有模型类,其中的部分类标记有数据注释属性和对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


我可以让数据注释像这样通过视图模型的属性进行验证吗?或者我应该用另一种方式进行验证吗?

您可以发布您的xval帮助程序代码和一些Html.helper吗

它使用实体和前缀,所以我不明白为什么视图模型中的结构会有任何不同。比如:

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


James

如果使用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,但我仍在为其添加前缀以处理验证消息。

如果我读得正确,您将把DataAnnotation放在linq to sql类上,然后用linq to sql类中的属性填充viewmodel属性

要使其与xval一起工作,您需要将DataAnnotation放在视图模型属性上。据我所知,从XVAL代码来看,它没有在公共属性之外寻找任何验证信息(如果我在这里出错,请有人纠正我)


如果您想使模型和viewmodel之间的验证透明,您可以使用postsharp绑定属性,但如果您的程序很小,这可能会是一项繁重的工作,但收效甚微。

我面前没有确切的代码,但我有一些类似的东西,可以在需要时使用。由于服务器端的IsValid调用也无法正常工作,我认为这是一个注释问题,不是xval问题,但可能是错误的。我也遇到了同样的问题。如果它回答了您的问题,请在上面标出答案