2012-02-10 68 views
0

我的應用程序中有某些屬性需要動態設置,無論它們是否需要,因此我無法使用[必需的]數據註解的屬性。在MVC 3.0中,當設置IsRequired屬性的ModelMetadata時,它不會添加驗證

也許這不是實現我想要的最好方法。所以我會接受這方面的建議。 我已經覆蓋了DataAnnotationsModelMetadataProvider有:

public class DynamicFieldsMetadataProvider : DataAnnotationsModelMetadataProvider 
    { 
     public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType) 
     { 
      if (containerType == null) 
       throw new ArgumentNullException("containerType"); 

      if (!typeof(DynamicFieldDataItem).IsAssignableFrom(containerType)) 
       foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType)) 
        yield return metadataProperty; 
      else 
       foreach (var metadataProperty in base.GetMetadataForProperties(container, containerType)) 
       { 
        var dynamicField = (DynamicFieldDataItem)container; 
        if (metadataProperty.PropertyName == "DataFieldValue") 
         metadataProperty.IsRequired = dynamicField.IsRequired; 
        yield return metadataProperty; 
       } 

     } 
} 

這只是一個概念測試,一旦我做它的工作,我會改變它的東西充滿生機與活力多個對象,但到目前爲止,只有能夠設置屬性DataFieldValue的MetadataModel爲IsRequired = true我可以開始了。

有了這個,我在一個動態的方式成功設置IsRequired財產真實的(我想,這個就足夠了!),當我在我看來debugg:

@Html.EditorFor(model=>model.DataFieldValue) 

酒店DataFieldValue聲明像這樣:

public class DynamicFieldDataItem 
    { 
     public string DataFieldValue { get; set; } 
     public bool IsRequired{ get; set; } 
    } 

我可以看到,元數據,擁有財產的真實IsRequired,但是當「DataFieldValue」呈現了「驗證」是不存在的,當然還有驗證不起作用。

爲了確保我的項目配置沒有問題,我檢查了web.config,並且包含了用於驗證的javascripts,所有配置都已正確配置。更重要的是,如果我添加需要我的財產屬性,像這樣:

public class DynamicFieldDataItem 
    { 
     [Required] 
     public string DataFieldValue { get; set; } 
     public bool IsRequired{ get; set; } 
    } 

驗證完美的作品!

任何人都可以給我一個提示嗎?或者告訴我我做錯了什麼?

謝謝!

回答

1

我相信你需要一個自定義的ModelMetadataProvider和一個自定義的ModelValidatorProvider才能工作。根據我的經驗,他們似乎沒有互相利用,並且似乎都設置了不同的驗證。

相關問題