2014-10-20 43 views
2

我是新来的MVC.NET,似乎无法理解为什么我的验证函数没有被调用,它位于MyModel类中。验证方法没有在视图模型内部的模型上调用

为MyModel:

Public string Name { get; set; } 
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
// validation logic which is not being called on post. 
} 

当我发帖的形式,实际上,我张贴我的ViewModel具有为MyModel的一个属性。

视图模型:

Public MyModel { get; set; } 

控制器:

[HttpPost] 
public ActionResult Index(ViewModel model) 
{ 
    // this is always true?? 
    if(this.ModelState.IsValid) { blah blah } 
} 

它总是真实的原因是因为内部为MyModel我验证逻辑没有被从视图模型上的POST调用。

这可能是一个noob问题,但我不知道。谢谢你的帮助。

+1

我没有时间发布代码,对不起,但看着“自定义模型粘合剂”。为'ViewModel'创建一个自定义模型绑定器,当'public ActionResult Index(ViewModel model)'被调用时执行。在自定义模型联编程序中,您将能够调用验证方法。 – 2014-10-20 18:08:39

+1

只是扩大Jason的评论,[这SO帖子](http://stackoverflow.com/questions/6431478/how-to-force-mvc-to-validate-ivalidatableobject)应该给你一个想法如何去与'自定义式样黏结剂'。 – Michael 2014-10-20 18:23:16

+0

嗯,这不是MVVM - 它是MVC。你的“ViewModel”是一个模型。控制器是...控制器。而cshtml文件是视图。模型 - 视图 - 控制器。用于Web应用程序的MVVM框架通常位于客户端。 Angular和Knockout是MVVM客户端框架的两个例子。 – Will 2014-10-20 18:58:16

回答

2

感谢您的回复。其实我跟一个同事谁告诉我,为了得到视图模型发布和具有在视图模型引用的类验证拿的地方,我需要从IValidatableObject

public class MyModel : IValidatableObject 

继承比我只需要需要将ValidationContext validationContext传递给Validate方法。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
} 

它的工作!它在发布ViewModel时调用了MyModel的验证方法。

+0

我看到这正是迈克尔在提供的链接中所谈论的。 – 2014-10-20 18:29:51

0

您也可以查看DataAnnotations以了解您的验证要求;它可能会导致在您的模型中更清洁的代码:

using System.ComponentModel.DataAnnotations; 

[Required(ErrorMessage="Please supply a Name")] 
[RegularExpression(@"^([A-Za-z]{1,50}$")] 
Public string Name { get; set; } 

...例如。

相关问题