【问题标题】:ASP.NET MVC Model/ViewModel ValidationASP.NET MVC 模型/视图模型验证
【发布时间】:2010-11-18 15:14:34
【问题描述】:

我在 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 的服务器端检查始终为真。

我可以让数据注释通过视图模型的属性拉出以进行这样的验证,还是应该以另一种方式这样做?

【问题讨论】:

  • 如果回答了您的问题,请在此标记答案

标签: asp.net-mvc validation viewmodel data-annotations


【解决方案1】:

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

【讨论】:

  • 我遇到了同样的问题。
【解决方案2】:

如果我没看错,您将 DataAnnotations 放在 linq to sql 类上,然后用您的 linq to sql 类填充您的视图模型属性。

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

如果您想让模型和视图模型之间的验证透明化,您可以使用 postsharp 绑定属性,但如果您的程序很小,这可能会做很多工作而收效甚微。

【讨论】:

    【解决方案3】:

    您能否发布您的 xval 帮助程序代码以及您的一些 Html.Helpers?

    它需要实体和前缀,所以我不明白为什么你的视图模型中的结构应该有任何区别。比如:

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

    詹姆斯

    【讨论】:

    • 我面前没有确切的代码,但我有类似的东西,() %>,当它是 时它可以工作。由于服务器端的 IsValid 调用也无法正常工作,我认为这是一个注释问题而不是 xval 问题,但可能是错误的。
    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多