2009-12-17 31 views
5

Tôi đang cố gắng tạo Trình trợ giúp HTML tùy chỉnh đóng gói một số logic trình bày vì tôi phải sử dụng lại logic này một vài lần trên cùng một trang và có thể trong tương lai.Làm cách nào để sử dụng Trình trợ giúp HTML ValidationMessage ASP.NET MVC bên trong trình trợ giúp tùy chỉnh của riêng tôi?

Nếu địa chỉ của người dùng ở Bắc Mỹ, thì tôi muốn hai hộp văn bản được hiển thị cho đầu vào số điện thoại, một cho mã vùng và một cho số còn lại của số. Nếu địa chỉ ở bên ngoài Bắc Mỹ, thì tôi muốn một hộp văn bản cho toàn bộ số được hiển thị.

Đoạn mã sau đang hoạt động như dự định để xuất các hộp văn bản chính xác, ngay sau khi tôi thêm xác thực liên kết với mỗi hộp văn bản, bây giờ tôi nhận được một NullReferenceException được ném từ cuộc gọi ToString() trên Trình trợ giúp ValidationMessage cuộc gọi (Trình trợ giúp ValidationMessage trả về giá trị rỗng !!).

public static string TelephoneNumberInputListItem(this HtmlHelper helper, 
             string country, 
             string northAmericanAreaCodeFormName, 
             string northAmericanAreaCode, 
             string northAmericanRemainingNumberFormName, 
             string northAmericanRemainingNumber, 
             string internationalFullNumberFormName, 
             string internationalFullNumber) 
    { 

     //set up the error message and styling 
     object errorHtmlAttributes = new { @class = "fError" }; 
     string validationMessage = "*"; 

     object htmlAttributes; 

     //start building our list item tag which includes our telephone number 
     //input and validation controls 
     TagBuilder listItemBuilder = new TagBuilder("li"); 

     //determine based on the country specified if this should be a North 
     //American phone input form or an international one 
     if (isNorthAmericanCountry(country)) 
     { 
      //add the text input controls 
      htmlAttributes = new { size = 3, maxlength = 3 }; 
      listItemBuilder.InnerHtml = helper.TextBox(northAmericanAreaCodeFormName, northAmericanAreaCode, htmlAttributes).ToString(); 

      htmlAttributes = new { size = 7, maxlength = 7 }; 
      listItemBuilder.InnerHtml += helper.TextBox(northAmericanRemainingNumberFormName, northAmericanRemainingNumber, htmlAttributes).ToString(); 

      //Add the Validation Message controls 
      listItemBuilder.InnerHtml += helper.ValidationMessage(northAmericanAreaCodeFormName, validationMessage, errorHtmlAttributes).ToString(); 
      listItemBuilder.InnerHtml += helper.ValidationMessage(northAmericanRemainingNumberFormName, validationMessage, errorHtmlAttributes).ToString(); 
     } 
     else 
     { 
      //add the text input control 
      htmlAttributes = new { size = 15, maxlength = 15 }; 
      listItemBuilder.InnerHtml = helper.TextBox(internationalFullNumberFormName, internationalFullNumber, htmlAttributes).ToString(); 

      //Add the Validation Message control 
      listItemBuilder.InnerHtml += helper.ValidationMessage(internationalFullNumberFormName, validationMessage, errorHtmlAttributes).ToString(); 
     } 

     return listItemBuilder.ToString(TagRenderMode.Normal); 
    } 

Bạn có thể vui lòng giúp tôi thêm xác thực để các hộp nhập liệu này vẫn là một phần của xác thực biểu mẫu tổng thể xảy ra trong Chế độ xem cuộc gọi không? Tôi nên đề cập đến việc đặt TextBox và Trình trợ giúp ValidationMessage trực tiếp trong Chế độ xem hoạt động chính xác.

Có rất nhiều điều thú vị khi sử dụng Trình trợ giúp HTML ("nếu có IF, hãy sử dụng trợ giúp" bất kỳ ai?), Nhưng chúng ta phải sử dụng chúng như thế nào nếu chúng ta không thể thêm điều khiển xác thực vào điều khiển đầu vào sử dụng.

Cảm ơn bạn trước sự giúp đỡ của bạn.

Trả lời

4

Trình trợ giúp ValidationMessage trả về giá trị rỗng nếu không có lỗi được chỉ ra trong Trạng thái mô hình tương ứng. Xem mã thực tế bên dưới ...

Vì trình trợ giúp ValidationMessage trả về một chuỗi, không có lý do gì để gọi ToString() (đó là nguyên nhân gây ra ngoại lệ). Hủy bỏ ToString và mã của bạn sẽ hoạt động như mong đợi.

Bạn cũng có thể xóa cuộc gọi ToString của mình khỏi người trợ giúp TextBox.

public static string ValidationMessage(this HtmlHelper htmlHelper, string modelName, string validationMessage, IDictionary<string, object> htmlAttributes) { 
    if (modelName == null) { 
    throw new ArgumentNullException("modelName"); 
    } 

    if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName)) { 
    return null; 
    } 

    ModelState modelState = htmlHelper.ViewData.ModelState[modelName]; 
    ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors; 
    ModelError modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors[0]; 

    if (modelError == null) { 
    return null; 
    } 

    TagBuilder builder = new TagBuilder("span"); 
    builder.MergeAttributes(htmlAttributes); 
    builder.MergeAttribute("class", HtmlHelper.ValidationMessageCssClassName); 
    builder.SetInnerText(String.IsNullOrEmpty(validationMessage) ? GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState) : validationMessage); 

    return builder.ToString(TagRenderMode.Normal); 
} 
+0

Cảm ơn bạn đã mkedobbs vì đã làm rõ rằng Trình trợ giúp xác thực tính hợp lệ trả về null khi không có lỗi trong ModelState. Loại bỏ các ToString() không sovle vấn đề của tôi, nhưng lý do tại sao tôi đã có nó ở nơi đầu tiên là bởi vì những người giúp đỡ trở lại loại MVCHtmlString, mà tôi không thể chuyển đổi thành một chuỗi thông qua đúc. Bằng cách nào đó, mặc dù ghép nối MVCHtmlString này với một chuỗi khác (trong trường hợp của tôi bằng cách sử dụng toán tử + =) chuyển đổi nó thành một chuỗi thành công, do đó, vấn đề (s) được giải quyết. – FullOfQuestions

Các vấn đề liên quan