2010-04-01 62 views
0

我想获得验证在ASP.NET MVC 2中工作,但没有太大的成功。ASP.NET MVC 2模型封装在ViewModel验证

我有一个复杂的类包含大量的字段。 (不要问 - 这是最佳实践无法触及的现实世界情况)这通常是我的模型,并且是LINQ到SQL生成的类。

因为这是生成的代码,所以我创建了一个按照http://davidhayden.com/blog/dave/archive/2009/08/10/AspNetMvc20BuddyClassesMetadataType.aspx的MetaData类。

public class ConsultantRegistrationMetadata 
{ 

    [DisplayName("Title")] 
    [Required(ErrorMessage = "Title is required")] 
    [StringLength(10, ErrorMessage = "Title cannot contain more than 10 characters")]  
    string Title { get; set; } 

    [Required(ErrorMessage = "Forename(s) is required")] 
    [StringLength(128, ErrorMessage = "Forename(s) cannot contain more than 128 characters")] 
    [DisplayName("Forename(s)")] 
    string Forenames { get; set; } 
     // ... 

我已附加到这个局部类我生成的类:

[MetadataType(typeof(ConsultantRegistrationMetadata))] 
public partial class ConsultantRegistration 
{ 
    // ... 

因为我的形式是复杂的,它具有许多相关性,比如SelectLists等,其余的具有封装在一个ViewModel图案 - 和包括在ConsultantRegistration模型作为属性:

public class ConsultantRegistrationFormViewModel 
{ 
    public Data.ConsultantRegistration ConsultantRegistration { get; private set; } 

    public SelectList Titles { get; private set; } 
    public SelectList Countries { get; private set; } 
// ... 

所以它本质上是视图模型=>模型

我的视图,然后有:

<p> 
     <%: Html.LabelFor(model => model.ConsultantRegistration.Title) %> 
     <%: Html.DropDownListFor(model => model.ConsultantRegistration.Title, Model.Titles,"(select a Title)") %> 
     <%: Html.ValidationMessage("Title","*") %> 
    </p> 

    <p> 
     <%: Html.LabelFor(model => model.ConsultantRegistration.Forenames) %> 
     <%: Html.TextBoxFor(model => model.ConsultantRegistration.Forenames) %> 
     <%: Html.ValidationMessageFor(model=>model.ConsultantRegistration.Forenames) %> 
    </p> 

的问题是,在元数据类的属性验证的是无效果。我试图通过一个接口,但也没有效果。我开始认为这是因为我将模型封装在ViewModel中。

我控制器(创建操作)如下:

[HttpPost] 
     public ActionResult Create(Data.ConsultantRegistration consultantRegistration) 
     { 
      if (ModelState.IsValid) // this is always true - which is wrong!! 
      { 
       try 
       { 

        consultantRegistration = ConsultantRegistrationRepository.SaveConsultantRegistration(consultantRegistration); 

        return RedirectToAction("Edit", new { id = consultantRegistration.ID, sectionIndex = 2 }); 
       } 
       catch (Exception ex) 
       { 
        ModelState.AddModelError("CreateException",ex); 
       } 
      } 

      return View(new ConsultantRegistrationFormViewModel(consultantRegistration)); 

     } 

正如评论所述,该ModelState.IsValid属性始终返回true,尽管有不是有效的Validaiton注释字段。 (Forenames是一个关键的例子)。

我错过了一些明显的东西 - 考虑到我是一名MVC新手?我是在Jon Galloway在http://www.asp.net/learn/mvc-videos/video-10082.aspx演示的机制之后。

(AM意识到t是类似于ASP.NET MVC Model/ViewModel Validation但似乎后谈XVAL。我不知道那是什么,并怀疑它是MVC 1)

回答

1

我一直在努力使这项工作一段时间。根据你包含的代码,我认为你做对了。

我认为问题是应该被“发射”到页面的JavaScript验证器。这里还有其他几个与这个问题有关的问题,我不认为他们中的任何一个都提供了一个全面的解决方案。据我所知,MVC2 RC仍然存在问题。

UPDATE:

如果在应用属性将发射的代码它的工作原理,看看这个:

When using Data Annotations with MVC, Pro and Cons of using an interface vs. a MetadataType

这可能是不工作的MetadataType属性。如果按照上述问题中的建议尝试使用界面,它会起作用吗?

此外,另一个问题:MetadataType and client validation in ASP.NET MVC 2

那一个是相当新的,并确认这仍是MVC2的错误。

+0

啊,太好了。如果我直接在LINQ-to-SQL生成的代码上应用这些属性,它就可以工作(不是JS,但是一半是一样的)。显然不是解决方案。 – 2010-04-01 14:39:08

+0

已更新的答案... – 2010-04-01 15:21:57

+0

谢谢戴夫。我不得不等到星期三看看我下班时的工作。虽然,注意到。 – 2010-04-01 17:45:23