数据注释无法从ModelSate获取错误消息,而不是必需的
本文关键字:消息 取错误 注释 获取 ModelSate 数据 | 更新日期: 2023-09-27 18:01:22
我使用Data Annotation
进行服务器端验证,从客户端我将数据发送到控制器,然后从ModelState
我试图获得ErrorMessage
。
我的代码。
[Required(ErrorMessage = "Order ID cannot be null")]
[Range(0, int.MaxValue, ErrorMessage = "OrderID must be greater than 0.")]
public int OrderID
{
get;
set;
}
[Required]//(ErrorMessage = "Customer ID cannot be null")]
[StringLength(5, ErrorMessage = "CustomerID must be 5 characters.")]
public string CustomerID
{
get;
set;
}
My controller code
public ActionResult Validate(EditableOrder order)
{
if (!ModelState.IsValid)
{
List<string> errorlist = new List<string>();
foreach (ModelState modelState in ModelState.Values)
{
foreach (ModelError error in modelState.Errors)
{
errorlist.Add(error.ErrorMessage);
}
}
return Content(new JavaScriptSerializer().Serialize(errorlist));
}
return Content("true");
}
My Script code.
var record = args.data;
$.ajax({
url: "/Inlineform/Validate",
type: "POST",
data: record,
success: function (data) {
var errorlist = JSON.parse(data);
var i;
if (errorlist.length)
{
args.cancel = true;
var str="";
$.each(errorlist,function(index,error){
str+="<tr><td>"+error+"</td></tr>";
});
$("#ErrorList").html("<table>"+str+"</table>");
}
}
当向动作Validate
发出请求时,我可以将其与EditableOrder
绑定,并且在ModelState中,我只获得Required
的ErrorMessage
,而不是Range
或StringLength
。
这里出了什么问题?
谢谢。
要使验证对MVC2有效,您必须在包含需要验证的字段的页面上放置以下代码:
<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
...
@Html.EnableClientValidation();
同样,使用StringLength对于最小长度也不起作用。MVC中StringLength的默认适配器是:
public class StringLengthAttributeAdapter : DataAnnotationsModelValidator<StringLengthAttribute>
{
public StringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute): base(metadata, context, attribute)
{}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
return new[] { new ModelClientValidationStringLengthRule(ErrorMessage, 0, Attribute.MaximumLength) };
}
}
写这段代码时,有人在微软休假。
您可以使用以下命令重写StringLength适配器,使其正常工作:
public class StringLengthAttributeAdapter : DataAnnotationsModelValidator<StringLengthAttribute>
{
public StringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute): base(metadata, context, attribute)
{}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
return new[] { new ModelClientValidationStringLengthRule(ErrorMessage, Attribute.MinimumLength, Attribute.MaximumLength) };
}
}
最后,将此代码放入global.asax.cs文件中:
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(StringLengthAttribute), typeof(MVCWebPractice.Models.StringLengthAttributeAdapter));
这修复了StringLength的问题。你不需要创建任何客户端javascript来实现这些
要打印特定部分的错误摘要,请将此位置放在视图的适当位置:
<%: Html.ValidationSummary(false) %>
您需要将标志设置为false以显示与属性值相关的错误。我假设这就是你想用自定义javascript代码做的事情。