2013-02-06 34 views
1

我正在創建註冊表單。我有一個屬於國家身份號碼的財產。但我希望用戶在確認註冊後填寫它。然後我不寫在註冊表格中。模型無效

評論:

National Identity Number 
<div class="editor-field"> 
    @Html.EditorFor(model => model.IdentityNumber) 
    @Html.ValidationMessageFor(model => model.IdentityNumber) 
</div> 

這是我的財產:

[IdentityNumber("It is not a valid identity number")] 
[Required(ErrorMessage = "You have to enter your national number")] 
[DisplayName("National Identity Number:")] 
public string IdentityNumber { get; set; } 

但是,這是行不通的。我認爲原因是屬性[IdentityNumber][Required]。如果我評論他們,

public ActionResult Register(Member model) 
{ 
    if (ModelState.IsValid) 
    { 
     //..... 

ModelState.IsValidfalse。如果我取消註釋它,它將返回true。那麼,我必須改變一些東西來允許它?我的意思是,我希望用戶在註冊後寫下他/她的身份證號碼。

在我的db中,身份的國家號碼字段也允許爲空。

編輯:這裏是我的屬性代碼:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, 
AllowMultiple = false, Inherited = true)] 
public class IdentityNumberAttribute : ValidationAttribute, IClientValidatable 
{ 
    private string WrongIdentityNumber; 

    public IdentityNumberAttribute(string message) 
     :base("Invalid an identity number") 
    { 
     WrongIdentityNumber = message; 
    } 

    private string identityNumber; 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value == null) 
      return new ValidationResult(WrongIdentityNumber); 

     identityNumber = value.ToString(); 

     if (identityNumber.Length != 11) 
      return new ValidationResult(WrongIdentityNumber); 

     int sum = 0; 

     for (int i = 0; i < identityNumber.Length - 1; i++) 
     { 
      sum += Convert.ToInt32(identityNumber[i].ToString()); 
     } 

     return sum.ToString()[1] == identityNumber[10] 
        ? ValidationResult.Success 
        : new ValidationResult(WrongIdentityNumber); 
    } 


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     ModelClientValidationRule validationRule = new ModelClientValidationRule(); 
     validationRule.ValidationType = "identitynumber"; 
     validationRule.ErrorMessage = "Invalid identity number"; 
     validationRule.ValidationParameters.Add("param", ""); 
     return new List<ModelClientValidationRule> { validationRule }; 

     //var rule = new ModelClientValidationRule(); 
     //rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); 
     //rule.ValidationParameters.Add("identitynumber", identityNumber);  //küçük harfle yaz html kuralı 
     //rule.ValidationType = "identitynumber"; 
     //yield return rule; 
    } 
} 
+0

您已設置[必需的]屬性。刪除它並嘗試一下 –

+0

我試過了。正如我前面所寫,IdentityNumber屬性也是問題 – ertan2002

回答

4

可以加入這一行

ModelState.Remove("ErrorKey");//you can find the error key by stepping though your code 
if (ModelState.IsValid) 
     { 
      ..... 

像 「YourModelName.YourPropertyName」 中的 「ErrorKey」 將是什麼。設置一個斷點並將鼠標懸停在ModelState上,您可以看到所有的鍵。

但是你應該創建一個視圖模型,只有你需要的屬性,把你的數據註釋放在那裏,並離開你的域模型。

+0

非常感謝,我試了一下,並工作:) – ertan2002

+0

不客氣。 –

+0

通常我在註冊表中需要它,但我們決定改變它。然後,我們會在用戶完成註冊後再使用它。 :) – ertan2002