2015-07-13 47 views
0

當我使用jQuery.load時,我試圖獲取JQueryValidate自定義驗證屬性似乎沒有工作。這是我的代碼:JQuery驗證自定義方法不工作後jquery.load()

CreateViewModel.cs

public class CreateViewModel 
{ 
    [DisplayName("Artwork")] 
    public int ArtworkId { get; set; } 

    [AtLeastOne("selectiongroup")] 
    public bool IsPromo { get; set; } 
    [AtLeastOne("selectiongroup")] 
    public bool IsUpc { get; set; } 
    [AtLeastOne("selectiongroup")] 
    public bool IsCoupon { get; set; } 

    public SelectList ArtworkSelectList { get; set; } 
} 

AtLeastOneAttribute.cs

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] 
public class AtLeastOneAttribute : ValidationAttribute, IClientValidatable 
{ 
    public string GroupName { get; private set; } 

    public AtLeastOneAttribute(string groupName) 
    { 
     GroupName = groupName; 
    } 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     yield return new ModelClientValidationRule 
     { 
      ErrorMessage = "At least one of Coupon or Upc or Promo is required.", 
      ValidationType = "atleastone", 
      ValidationParameters = 
      { 
       new KeyValuePair<string, object>("groupname", GroupName), 
      } 
     }; 
    } 
} 

Page.cshtml

<form method="POST" id="signCreationForm"> 
    <div class="container-fluid"> 
     <div class="row"> 
      <div class="col-lg-6"> 
       @Html.LabelFor(model => model.ArtworkId) 
       @Html.DropDownListFor(model => model.ArtworkId, Model.ArtworkSelectList, "Select an Artwork") 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-lg-6"></div> 
      <div>@Html.ValidationMessageFor(model => model.ArtworkId)</div> 
     </div> 
     <div class="row"> 
      <div class="col-lg-10"> 
       <label>Associated With:</label> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-lg-4"> 
       @Html.LabelFor(model => model.IsUpc, "UPC") 
       @Html.CheckBoxFor(model => model.IsUpc) 
       @Html.ValidationMessageFor(model => model.IsUpc) 
      </div> 
      <div class="col-lg-4"> 
       @Html.LabelFor(model => model.IsCoupon, "Coupon") 
       @Html.CheckBoxFor(model => model.IsCoupon) 
       @Html.ValidationMessageFor(model => model.IsCoupon) 
      </div> 
      <div class="col-lg-4"> 
       @Html.LabelFor(model => model.IsPromo, "Promotion") 
       @Html.CheckBoxFor(model => model.IsPromo) 
       @Html.ValidationMessageFor(model => model.IsPromo) 
      </div> 
     </div> 
    </div> 
</form> 
@Scripts.Render("~/bundles/jqueryval") 
<script type="text/javascript"> 
    $.validator.addMethod("atleastone", function (value, element, params) { 
     return $("[data-val-atleastone-groupname="+params+"]:checked").length > 0; 
    }); 

    $.validator.unobtrusive.adapters.add("atleastone", ["groupname"], function (options) { 
     options.rules["atleastone"] = options.params.groupname; 
     options.messages["atleastone"] = options.message; 
    }); 
</script> 

CallingPage.cshtml(JavaScript的正在調用它)

 $("#create-ad[data-link]").on("click", function() { 
      var link = $(this).data("link"); 
      $createDialog.load(link, function() { 
       $createDialog.dialog("open"); 
       $.validator.unobtrusive.parse($("#signCreationForm")); 
      }); 
     }); 

現在,此代碼在單獨的項目中工作。在這個項目中,局部視圖是通過jquery.load()事件加載的,由於某些原因,這會導致自定義方法永遠不會執行。我知道這一點,因爲警報通常會針對使用atleastone屬性裝飾的每個屬性啓動一次。

使用jquery加載自定義jqueryvalidate驗證時,是否有什麼特別需要在Page.cshtml上完成?

+2

http://stackoverflow.com/questions/16105170/jquery-validation-unobtrusive-client-side-validation-only-works-when-scripts-are – mplungjan

+0

關閉,但是當我將解析代碼添加到我的方法中他添加他的地方,我addMethod不運行。但是適配器被執行。 –

回答

0

對於這種情況回答https://stackoverflow.com/a/16105954/82333建議的重複了這是,在加$ .validator.unobtrusive.adapters.add沒有發揮作用問題的前半部分。然而,在此之後,其餘的代碼也沒有運行。

@Bhavin Solanki對調用頁面包含驗證文件的評論修正了另一半,這是在提交代碼時未運行。

1

請把你的自定義的方法中jQuery的文件準備 ;;;;;;

對於I.E.

<script type="text/javascript"> 
$(document).ready(function(){ 
    $.validator.addMethod("atleastone", function (value, element, params) { 
     alert("halp"); 

     return $(".grouped:checked").length > 0; 
    }); 

    $.validator.unobtrusive.adapters.add("atleastone", ["groupname"], function (options) { 
     alert("halp"); 
     options.rules["atleastone"] = "#" + options.params.groupname; 
     options.messages["atleastone"] = options.message; 
    }); 
}); 
</script> 
+0

抱歉,這不起作用。 –

+0

嘗試在使用jquery.load()之前包含驗證文件和自定義方法。因爲.load()文件不會處於就緒狀態 –

相關問題