我在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。
我是否可以通过视图模型的属性来获取数据注释以进行验证,或者我应该以另一种方式执行此操作?
答案 0 :(得分:4)
如果您使用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,但我仍然以前缀来处理验证消息。
答案 1 :(得分:0)
您可以发布您的xval帮助程序代码和一些Html.Helpers吗?
它需要实体和前缀,所以我不明白为什么视图模型中的结构应该有所不同。类似的东西:
<%= Html.ClientSideValidation<Foo>("Foo") %>
<%= Html.ClientSideValidation<Bar>("Foo.Bar") %>
詹姆斯
答案 2 :(得分:0)
如果我正确读取了这个,你将把linq上的DataAnnotations放到sql类中,然后用你的linq到sql类填充你的viewmodel属性。
要使其与xval一起使用,您需要将DataAnnotations放在视图模型属性上。据我所知,从xvals代码来看,它不会超出公共属性的任何验证信息(如果我错了,请有人纠正我)。
如果你想让你的模型和视图模型之间的验证透明,你可以沿着使用postharp来绑定属性的路线,但如果你的程序很小,这可能会带来很多好处。