2011-12-01 48 views
1

我有,我已經創建了一個單獨的驗證類我的實體對象一個奇怪的情況:「必需」驗證屬性不能在asp.net mvc的3個工作,而其他工作

[MetadataType(typeof(TopTenFav_Validation))] 
public partial class TopTenFav 
{ 

} 
public class TopTenFav_Validation 
{ 

    [Required(ErrorMessage = "Youtube link is Required")] 
    [StringLength(100, ErrorMessage="Youtube link cannot exceed 100 characters")] 
    [Range(10,20)] 
    public string YoutubeLink { get; set; } 


    [StringLength(100, ErrorMessage = "Youtube link cannot exceed 50 characters")] 
    [Required] 
    [MinLength(5, ErrorMessage = "Youtube link cannot be shorter than 30 characters")] 
    public string Title { get; set; } 
} 

實體對象的名稱是與我的驗證類相同 - TopTenFav,所以我會自動將驗證邏輯映射到我的實體框架對象。我有一個小的形式,我映射文本框的模式如下:

  <div> 
      @Html.TextBoxFor(m => m.topTenFav.YoutubeLink, new { id = "youTubeLinkTxt"   }) 
      @Html.ValidationMessageFor(m => m.topTenFav.YoutubeLink,"*") 
     </div> 

     <div> 
      @Html.TextBoxFor(m => m.topTenFav.Title, new { id = "youTubeNameTxt" }) 
      @Html.ValidationMessageFor(m => m.topTenFav.Title,"*") 
     </div> 

的問題是,所需要的屬性是不工作,而其他工作,這意味着當我離開的文本框爲空,我做一個Ajax調用代碼傳遞給服務器的成功,但是當我鍵入不通過minLenght驗證器的數據時,代碼會按照我的預期轉到我的ajax調用的錯誤部分。那麼我在這裏錯過了當我的文本框爲空時所需的驗證器沒有啓動?

$(document).on("click", ".btnAddTopTenFav", function() { 
     var btnClicked = $(this); 
     var txtLink = $('#youTubeLinkTxt').val(); 
     var txtName = $('#youTubeNameTxt').val(); 
     var subLink = txtLink.substr(31); //.replace(/.*\?v=/, ''); 
     var rank = $(this).parent().index() + 1; 
     $("#hiddenRank").val(rank); 

     $.ajax({ 
      beforeSend: function() { ShowAjaxLoader(); }, 
      url: "/Home/AddTopTenFav/", 
      type: "POST", 
      data: $("#AddTopTenFavForm").serialize(), 
      success: function (data) { HideAjaxLoader(), ShowMsg("Song Added Successfully"), $(btnClicked).replaceWith('<a name="' + subLink + '" class="savedLinks" href="#" >' + txtName + '</a><span name=' + data + ' class="btnDeleteTopTenFavSong dontDoAnything">x</span'); }, 
      error: function() { HideAjaxLoader(), ShowMsg("Song could not be added, please try again") } 
     }); 


    [HttpPost] 
    public ActionResult AddTopTenFav(HomeViewModel topTen) 
    { 
     if (ModelState.IsValid) 
     { 
      var top = new TopTenFav(); 
      top.Date = DateTime.Now; 
      top.Rank = topTen.topTenFav.Rank; 
      top.UserName = User.Identity.Name; 
      top.YoutubeLink = topTen.topTenFav.YoutubeLink; 
      top.Title = topTen.topTenFav.Title; 
      repository.AddTopTen(top); 
      repository.Save(); 
      return this.Content(top.SongId.ToString()); 
     } 
     else 
     { 
      return View(); 
     } 
+0

爲您的控制器發佈代碼請 – Dismissile

+0

您如何在您的AJAX調用中調用驗證。請添加有關通話的詳細信息。 – counsellorben

+0

加上代碼 –

回答

4

問題是您在發佈之前未調用驗證。

MinLength驗證器觸發,因爲您正在將數據輸入到字段中,然後將其保留,從而調用該字段的驗證。但是,Required驗證器只會在表單的提交事件調用時觸發,或者手動調用表單驗證。

添加以下包裝的代碼在你$(document).on("click", ".btnAddTopTenFav"功能:

$("form").validate().form(); 
if ($("form").valid()) 
{ 
    // insert the rest of your submission code here 
} 

這將調用驗證,如果表單是有效的纔會提交。

+0

謝謝!現在工作 –

+0

一個問題,爲什麼你在驗證後添加.form()。它有什麼作用? –

+0

'form()'將導致所有驗證消息被更新。 – counsellorben

相關問題