2012-05-25 17 views
3

當我將代碼寫入客戶端時,我從MVC的[RegularExpression]驗證程序中獲取HTML編碼值。這不是錯誤消息的問題(因爲它應該被編碼爲以後顯示),但它真的搞砸了正則表達式:)在一個字符串字段,我的正則表達式如下:RegularExpression驗證碼編碼正則表達式< & >符號爲< >,導致jQuery驗證失敗

[RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")] 

當此得到由MVC3寫出來,就說明這樣看:

<input ... data-val-regex-pattern="^[^\&amp;lt;\&amp;gt;]*$" 
      data-val-regex="May not contain &amp;lt;,&amp;gt;" .../> 

編輯:

  • 因爲編碼的,也有人追趕<>,也與上話絆倒了:
  • t像蒂姆
  • g像山羊
  • 可能;但我沒有測試它

這個表達式的目的是過濾掉<和>,而不是禁用所有驗證頁面並在服務器端進行預製。該字段接受多種unicode語言,只有12個字符。

我的選擇是這樣的:

  1. 禁用asp.net一個頁面上輸入的完整性檢查,檢查的操作僅
  2. 找到一個複雜的正則表達式匹配3+的unicode範圍+/-破折號&數字 - .net + js compat。
  3. 寫不具有客戶端驗證
  4. 使用[Remote]驗證做在服務器端就像我們對其他領域

我傾向於#做的一個自定義的正則表達式驗證3現在,但我真的想找到一種方法來保持內置功能。有什麼辦法可以禁用這個輸出轉義嗎?

+0

你也可以使用遠程驗證來做到這一點 – cpoDesign

+0

是的,當然。儘管對於正則表達式似乎相當過分,但它應該位於可能解決方案的列表中。 –

回答

4

我花了一段時間,但我發現現在看起來很明顯:使用unicode literals而不是實際字符<>

我正則表達式弄成這個樣子,和兩個淨& JS

// \u003c = <, \u003e = > 
[RegularExpression(@"^[^\u003C\u003E]*$", ErrorMessage = "...")] 

我結束了一個自定義驗證屬性由具有無處不在的代碼保持工作。更好的方式是定製的「默認」的對象適配器&定製的jQuery對這個表達式驗證,因此允許格式附第二正則表達式。再工作一天。這是自定義類&驗證:正則表達式屬性的

自定義子類:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class RegexUnsafeChars : RegularExpressionAttribute 
{ 
    public RegexUnsafeChars() : base(@"^[^\u003C\u003E]*$") 
    { 
     base.ErrorMessage = "May not contain <,>"; 
    } 
} 

因爲這是一個自定義屬性,並提供僅用於精確匹配檢查,我們需要手動聲明適配器。謝天謝地,我們可以重新使用內置的正則表達式。添加在Application_Start()這個代碼Global.asax.cs

DataAnnotationsModelValidatorProvider.RegisterAdapter(
      typeof(RegexUnsafeChars), 
      typeof(RegularExpressionAttributeAdapter)); 
0

jQuery驗證應該可以正常工作,並且在測試時確實工作正常。這些值被正確編碼。

型號:

public class MyViewModel 
{ 
    [DataType(DataType.MultilineText)] 
    [RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")] 
    public string Text { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     model.Text = "<Hello"; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

查看:

@model MyViewModel 

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Text) 
    @Html.ValidationMessageFor(x => x.Text) 
    <button type="submit">OK</button> 
} 

結果:

enter image description here

不顯眼的客戶端驗證正常工作。

+0

是什麼jquery.validate.unobtrusive.js – Hogan

+0

這是一個微軟腳本解釋HTML5包含在輸入數據 - 字段屬性*(見OP的標記),並將其轉換成jquery.validate規則。基本上,數據註釋屬性在相應的輸入字段上發出data- *屬性,並且在客戶端上執行不顯眼的客戶端驗證。這是一個在ASP.NET MVC的默認模型3 –

+0

你能告訴我你的HTML該標記?它也證實爲正確<>,但是,因爲編碼的,失敗上'l','g'和't'我(加';') –