2015-02-10 77 views
-1

我有以下代码:验证在ASP.NET MVC 5

@using (Html.BeginForm("TestForm", "Home", FormMethod.Post, new { id="form1" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Test</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <input type="text" name="field1" /> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

和下面的JS脚本:

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    @Scripts.Render("~/bundles/jqueryui") 
    <script> 

     $(function() { 
      $.validator.addMethod('integer', function (value, element, param) { 
       return (value != 0) && (value == parseInt(value, 10)); 
      }, 'Please enter a non zero integer value!'); 


      $("#form1").validate({ 
        field1: { 
         required: true, 
         integer: true 
        } 

       } 
      }); 
     }); 
    </script> 
} 

姓验证工作,验证FIELD1 - 不起作用。如果我从页面中删除此部分:

<div class="form-group"> 
     @Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

then field1 validation works。因此,“标准”验证与我的验证冲突。如何结合它?

回答

0

您还需要一个unobtrusive.adapter添加到JQuery验证,包括相关的data-val-属性来控制,添加添加ValidationMessageFor()显示消息

添加下面的脚本

// function to test for integer and not equal to zero 
function isInteger(value) { 
    return (value != 0) && (value == parseInt(value, 10)); 
} 

$.validator.addMethod('integer', function (value, element, params) { 
    return isInteger(value); 
}); 

$.validator.unobtrusive.adapters.add("integer", [], function (options) { 
    options.rules['integer'] = {}; 
    options.messages['integer'] = options.message; 
}); 

并在视图

@Html.TextBoxFor(m => m.YourInteger, new { data_val_integer = "The field must be an integer and not equal to zero" }) 
@Html.ValidationMessageFor(m => m.YourInteger) 

要避免手动添加data_val_integer,您可以创建一个cust OM帮手,例如

public static MvcHtmlString IntegerFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
{ 
    string name = ExpressionHelper.GetExpressionText(expression); 
    string message = string.Format("The field {0} must be an integer and not equal to zero", name); 
    return InputExtensions.TextBoxFor(helper, expression, new { htmlAttributes = new { data_val_integer = message }}) 
} 

,然后在视图

@Html.IntegerFor(m => m.YourInteger) 
+0

谢谢你,但它无法正常工作。也许需要添加验证方法? – 2015-02-10 20:31:02

+0

它确实有效,我已经测试过了(和其他人一样)。我只能假设你有其他脚本干扰(或没有删除你发布的问题中的脚本) – 2015-02-10 20:48:01

+0

看看这个http://jsfiddle.net/2VJZT/487/。什么是不正确的(结果html的副本)? – 2015-02-10 22:17:22