2012-11-21 26 views
2

視圖模型:處理換行符與ASP MVC textarea元素和jQuery不顯眼的驗證

public class ViewModel 
{ 
    [Display(Name = "Message")] 
    [StringLength(500, ErrorMessage = "Your message must be {1} characters or fewer.")] 
    public string Message { get; set; } 
} 

視圖(摘錄):

<div class="form-field-group"> 
    @Html.LabelFor(m => m.Message , "Your message:") 
    @Html.TextAreaFor(m => m.Message) 
    @Html.ValidationMessageFor(m => m.Message) 
</div> 

我還使用了不顯眼的驗證,像這樣的網絡.config:

<appSettings> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings> 

絕對是教科書的東西,它似乎工作出色。

的問題!

所以我的HTML spec for line breaks in form data的理解是,它編碼爲CR LF。這當然是我在調試處理這個視圖模型後的控制器動作時看到的。

然而,通過JavaScript讀取輸入的值時,換行符根據瀏覽器不同(IE6-8似乎給CRLF,而Chrome和Firefox最近建立在窗口給了剛剛LF)。

這意味着如果您輸入帶換行符的文本,jquery驗證器將讓他們看到的字符爲498個字符,但在到達模型綁定時,它將被轉換爲504和ModelState.IsValid是(正確)錯誤的。

任何人都有最好/最簡單的方法來解決這個問題的任何想法?

回答

1

MVC不顯眼的驗證(jquery.validate.unobtrusive.js)利用jquery.validate.js的。

所以解決這個問題的最簡單的方法是改變maxlength在jquery.validate.js中的行爲(這是jquery.validate.unobtrusive.js通過它的適配器附加的東西)。

下面的代碼將改變最大長度並修復問題:

(function ($) { 

    if ($.validator && $.validator.methods && $.validator.methods.maxlength) { 

     $.validator.methods.maxlength = function (value, element, param) { 
      if (typeof value === 'string') { 
       value = value.replace(/\r?\n/g, "\r\n"); 
      } 

      var length = $.isArray(value) ? value.length : $.validator.prototype.getLength($.trim(value), element); 
      return $.validator.prototype.optional(element) || length <= param; 
     }; 
    } 

})(jQuery); 

一些需要注意的是,這將不會對非Windows平臺的問題(或引起不同的問題)http://en.wikipedia.org/wiki/Newline

你也可以創建自己的驗證屬性和實施IClientValidatable添加自己的客戶端驗證http://www.falconwebtech.com/post/2012/04/21/MVC3-Custom-Client-Side-Validation-with-Unobtrusive-Ajax.aspx解決這個問題。這個的缺點是要記住使用你的屬性而不是標準的StringLength。你必須決定什麼是最適合你的情況。

+0

乾杯。這工作。這將通過未來的jQuery驗證升級來維持這一點很煩人。我可能會看到他們是否在意這一點。 – SimonF

+0

好。代碼是否會影響到另一個功能? – toha

相關問題