2013-02-06 3 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.IsValid

false입니다. 주석을 제거하면 true를 반환합니다. 그렇다면 어디에서 그것을 허용해야합니까? 내 말은, 사용자가 등록 후 ID 번호를 쓰길 원합니다.

내 데이터베이스에서 신원 국가 번호 필드는 null도 허용합니다.

편집 :

[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

당신은 "YourModelName.YourPropertyName"와 같은이 줄

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

에게 "ErrorKey"입니다 뭔가를 추가 할 수 있습니다 : 여기 내 속성 코드입니다. 중단 점을 설정하고 ModelState 위로 마우스를 가져 가면 모든 키를 볼 수 있습니다.

은 필요한 속성 만 가진 뷰 모델을 만들고 거기에 데이터 주석을 추가하고 도메인 모델을 그대로 두십시오.

+0

대단히 고마워, 나는 그것을 시도하고 작동 :) – ertan2002

+0

당신은 환영합니다. –

+0

일반적으로 나는 그것을 등록 양식에 필요했지만 우리는 그것을 변경하기로 결정했다. 그런 다음 사용자로부터 등록이 완료되면이를 원할 것입니다. :) – ertan2002