2015-07-13 49 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()文件不会处于就绪状态 –

相关问题