2015-05-07 120 views
1

我是新來的asp.net mvc和我有一些驗證的aform,我想驗證它在客戶端,所以我寫在JavaScript中的正常腳本 要更多specefic我的問題是返回false(因爲它不應該發送任何數據到服務器,仍然apage,但這不會發生),注意:我測試腳本在正常的HTML文件與JS和工作正常 ,但正如我所說我不熟悉MVC,所以我想知道是否有任何我錯過了它的工作,如果有任何toturial在這specefic點這將是很好的,因爲我注意到在這個地方(沒有地方對於初學者 :); 這是我的代碼片段太窗體驗證在asp.net mvc(使用javascript)

@model registerationex.Models.register 

@{ 
    ViewBag.Title = "Create"; 
} 


<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(false) 

    <fieldset> 
     <legend>register</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.name) 
     </div> 

     <div class="editor-field"> 
      @Html.EditorFor(model => model.name) 
      <span id="error"></span> 
      @Html.ValidationMessageFor(model => model.name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.email) 
     </div> 

     <div class="editor-field"> 
<input class="text-box single-line" data-val="true" data-val-required="The email field is required." id="email" name="email" type="text" value="" onblur="checkuser(email);">  
        <span id="erroruser"></span> 
      @Html.ValidationMessageFor(model => model.email) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.age) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.age) 
      <span id="errorage"></span> 
      @Html.ValidationMessageFor(model => model.age) 
     </div> 

     <p> 
      <input type="submit" value="Create" onclick="allvalidate();" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 



@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 

} 

<script> 
    function allvalidate() { 
     var validated = true; 
     if (!validate()) validated = false; 
     if (!checkAge(age)) validated = false; 
     if (!checkuser(email)) validated = false; 

     return validated; 
    } 


    function validate() { 
     var txtf = document.getElementById('name'); 
     if (txtf.value == 0 || txtf.value == null) { 
      document.getElementById('error').innerText = ('you must enter firstname'); 
      document.getElementById('error').style.color = 'red'; 

      txtf.focus(); 
      return false; 
     } 
     else { 
      document.getElementById('error').innerText = (''); 
      return true; 
     } 
    } 


    function checkAge(input) { 
     if (input.value < 18 || input.value > 70) { 
      document.getElementById('errorage').innerText = ('age must be from 18 :70'); 
      document.getElementById('errorage').style.color = 'red'; 
      return false; 
     } 
     else { 
      document.getElementById('errorage').innerText = (''); 
      return true; 
     } 

    } 


    function checkuser(input) { 
     var pattern = '^[a-zA-Z]+$'; 
     if (input.value.match(pattern)) { 
      document.getElementById('erroruser').innerText = ''; 
      return true; 
     } 
     else { 
      document.getElementById('erroruser').innerText = ('enter valid email'); 
      document.getElementById('erroruser').style.color = 'red'; 

      return false; 
     } 


    } 



</script> 

回答

3

您已包括@Scripts.Render("~/bundles/jqueryval")它默認jquery.validate.unobtrusive.js ,所以刪除所有腳本並利用MVC附帶的功能。只需將驗證屬性添加到您的屬性。

[Required(ErrorMessage = "you must enter firstname")] 
public string name { get; set; } 

[EmailAddress(ErrorMessage = "enter valid email")] 
public string email { get; set; } 

[Required(ErrorMessage = "you must your age")] 
[Range(18, 70, ErrorMessage = "age must be from 18 : 70")] 
public int age { get; set; } 

,你的腳本正在嘗試做的現在一切(不好)就是這樣做出來的方塊(假設未禁用不顯眼的驗證)和表單不會提交,直到錯誤得到糾正。你現在還獲得服務器端驗證是必要的驗證(客戶端驗證只是一個不錯的獎金,但任何人都可以很容易地通過它),所以你必須始終驗證服務器上

也取代您手動嘗試創建電子郵件屬性輸入與@Html.EditorFor(m => m.email)並刪除所有onclick attibutes

旁註:你的正則表達式^[a-zA-Z]+$甚至不會允許輸入一個有效的電子郵件地址(它甚至不容許@.字符!)。使用EmailAddress]屬性將產生正確的正則表達式是(從jQuery Validation 1.9.0

^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$ 
+0

感謝您的答案和反彈,我也只是想知道你的東西。我知道服務器驗證不是可選的,所以我想添加一個客戶端,除此之外,通過減少與服務器的連接來提高性能,所以如果我在模型中使用mvc屬性(這是在服務器或客戶端的驗證工作)並感謝您的電子郵件模式通知,請注意,這只是瞭解驗證,並且我想編寫簡單的模式來接受單詞並將其命名爲僅電子郵件@Stephen Muecke – user4833581

+1

首先,如果您已包含必需的腳本('jquery- {版本} .js','jquery.validate.js'和'jquery.validate.unobtrusive.js'),並且沒有禁用客戶端驗證,那麼您將使用驗證獲得**客戶端和服務器端驗證屬性。這是MVC的一個很好的特性,所以不要忽略它。 –

+1

接下來,'@ Html.LabelFor(model => model.email)'將生成一個帶有「email」文本的'

0

的allvalidate()函數應該像這樣(調用提交功能,沒有返回值):

<script> 
     function allvalidate() { 
      var validated = true; 
      if (!validate()) validated = false; 
      if (!checkAge(age)) validated = false; 
      if (!checkuser(email)) validated = false; 

      if(validated) 
       $('[type="submit"]').submit(); 
     } 
    </script> 
+0

感謝,但在這種情況下,它仍然將數據發送到服務器 它顯示一個錯誤masseges和quickily閃爍的數據,並保存到數據庫太,並工作鏈接,它返回真不假 因爲我想如果有任何案件沒有見過驗證返回虛假和數據仍然在客戶端,而不是發送@ trungtin1710 – user4833581