验证在ASP.NET MVC 5
问题描述:
我有以下代码:验证在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。因此,“标准”验证与我的验证冲突。如何结合它?
答
您还需要一个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)
谢谢你,但它无法正常工作。也许需要添加验证方法? – 2015-02-10 20:31:02
它确实有效,我已经测试过了(和其他人一样)。我只能假设你有其他脚本干扰(或没有删除你发布的问题中的脚本) – 2015-02-10 20:48:01
看看这个http://jsfiddle.net/2VJZT/487/。什么是不正确的(结果html的副本)? – 2015-02-10 22:17:22