2011-10-11 3 views
0

저는 로컬 아티스트를위한 온라인 상점을 구축 중이며 요구 사항 중 하나는 해당 제품과 관련된 이미지를 추가하는 것입니다. 이미지의 경우 유효성을 검사해야하는 여러 요소가 있습니다. 특히 크기, 파일 크기 및 유형.여러 속성 검증

현재, I는 이미지를 확인하도록 설정 다음 한 :

[LocalizedDisplayName(typeof(StoreManagementRes), "Image")] 
[ImageSize(typeof(BesLogicSharedRes),"ValidationImageFileSizeMustBeLessThan20kb")] 
[ImageDimension(typeof(BesLogicSharedRes), "ValidationImageDimensionMustBeLessThan640x480")] 
[ImageType(typeof(BesLogicSharedRes), "ValidationImageTypeMustBeJpgOrPng")] 
public int ImageFileId { get; set; } 

적절하게, 그러나, 그들은 반드시 매번 같은 순서로 호출되지 검증됩니까 업로드 파일 응용 프로그램이 실행 . 결국 하나 이상의 속성에서 유효성 검사가 실패하면 하나의 오류 메시지 만 표시됩니다. 다시 한번, 반드시 첫 번째 검증이 실패한 것은 아니며 마지막 검증도 실패한 것은 아닙니다. 한 번에 모든 오류를 표시하여 사용자를 좌절시키지 않으려합니다.

3 가지 이미지 유효성 검사 클래스가 모두 서브 클래스 ValidationAttribute 인 경우 관련이 있습니다.

답변

1

감사해야 할 점 중 하나는 모델이 그 중 하나가 아닌 모든 오류를 유지한다는 것입니다. 첫 번째 오류를 표시하는 HtmlHelper 일뿐입니다.

ValidationSummary는 실제로 개별 속성에 해당하는 것으로 의심되는데 실제로 모델의 모든 오류를 표시해야합니다.

불행히도 유용한 방법 중 몇 가지는 보호되지 않고 개인이므로 복사하여 붙여 넣어야했습니다 (ValidationExtensions.cs). 약간 줄여서 버전을 만들었습니다 (오류 메시지에 대한 리소스 파일을 사용하지 않고 GetUserErrorMessageOrDefault의 원본 버전을 가져 오는 것만으로도 쉽게 할 수 있지만 클래스의 관련 메서드와 필드도 확인해야합니다) . 필자는 하나의 함수 호출 만했지만 필요한 경우 과부하를 구현하기에 충분히 쉽습니다.

public static MvcHtmlString ValidationSummaryForSubModel(this HtmlHelper html, bool excludePropertyErrors, string message, IDictionary<string, object> htmlAttributes) 
    { 
     string prefix = html.ViewData.TemplateInfo.HtmlFieldPrefix; 
     var props = html.ViewData.ModelState.Where(x => x.Key.StartsWith(prefix)); 
     var errorprops = props.Where(x => x.Value.Errors.Any()).SelectMany(x=>x.Value.Errors); 

     if (html == null) { 
      throw new ArgumentNullException("html"); 
     } 
     FormContext formContext = (html.ViewContext.ClientValidationEnabled) ? html.ViewContext.FormContext : null; 
     if (formContext == null && html.ValidForSubModel()) 
     { 
      return null; 
     } 

     string messageSpan; 
     if (!String.IsNullOrEmpty(message)) { 
      TagBuilder spanTag = new TagBuilder("span"); 
      spanTag.SetInnerText(message); 
      messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine; 
     } 
     else { 
      messageSpan = null; 
     } 

     StringBuilder htmlSummary = new StringBuilder(); 
     TagBuilder unorderedList = new TagBuilder("ul"); 


     foreach (ModelError modelError in errorprops) { 
      string errorText = GetUserErrorMessageOrDefault(html.ViewContext.HttpContext, modelError, null /* modelState */); 
      if (!String.IsNullOrEmpty(errorText)) { 
       TagBuilder listItem = new TagBuilder("li"); 
       listItem.SetInnerText(errorText); 
       htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal)); 
      } 
     } 


     if (htmlSummary.Length == 0) { 
      htmlSummary.AppendLine(_hiddenListItem); 
     } 

     unorderedList.InnerHtml = htmlSummary.ToString(); 

     TagBuilder divBuilder = new TagBuilder("div"); 
     divBuilder.MergeAttributes(htmlAttributes); 
     divBuilder.AddCssClass((html.ViewData.ModelState.IsValid) ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName); 
     divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal); 

     if (formContext != null) { 
      // client val summaries need an ID 
      divBuilder.GenerateId("validationSummary"); 
      formContext.ValidationSummaryId = divBuilder.Attributes["id"]; 
      formContext.ReplaceValidationSummary = !excludePropertyErrors; 
     } 
     return MvcHtmlString.Create(divBuilder.ToString(TagRenderMode.Normal)); 
    } 

    private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState) 
    { 
     if (!String.IsNullOrEmpty(error.ErrorMessage)) 
     { 
      return error.ErrorMessage; 
     } 
     if (modelState == null) 
     { 
      return null; 
     } 

     string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null; 
     //return String.Format(CultureInfo.CurrentCulture, GetInvalidPropertyValueResource(httpContext), attemptedValue); 
     return "Error"; 
    }