ASP.NET MVC 模型/视图模型验证

5
我在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。
我能否让数据注释像这样拉取视图模型的属性进行验证,还是应该用另一种方式来实现?

请在回答中标记答案 - Tim Hoolihan
3个回答

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>

<% } %>

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

1
我也遇到了同样的问题。 - Hector Minaya

0
你能发布你的xval助手代码和一些Html.Helpers吗?
它需要实体和前缀,所以我不明白为什么你的视图模型内部结构会有任何区别。像这样的东西:
<%= Html.ClientSideValidation<Foo>("Foo") %>
<%= Html.ClientSideValidation<Bar>("Foo.Bar") %>

詹姆斯


我手头没有确切的代码,但是我有类似这样的东西,<%= Html.ClientSideValidation<FooViewModel>() %>,当它是<Foo>时它可以工作。由于服务器端的IsValid调用也无法正确工作,我认为这是一个注释问题而不是xval问题,但可能是我错了。 - blu

0

如果我理解正确,您正在将DataAnnotations放在Linq to SQL类上,然后使用来自Linq to SQL类的属性填充您的ViewModel属性。

要使xval与此配合工作,您需要将DataAnnotations放在ViewModel属性上。就我所知,从xval的代码中可以看出,它不会查找公共属性以获取任何验证信息(如果我在这里有误,请有人纠正我)。

如果您想在模型和ViewModel之间使验证透明,您可以使用PostSharp绑定属性,但如果您的程序很小,则可能需要付出很多努力而获得很少的收益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接