模型中未修饰的非可空值类型属性会自动获取DefaultModelBinder添加的验证消息“需要值”。我希望它代替显示“{Property DisplayName}”需要一个值。
使用string.format
模板,我可以使用 for DataAnnotated properties 来完成这项工作。我也可以在这种情况下更改默认文字字符串以显示DefaultModelBinder。我已经添加了一个模板化的字符串作为资源:PropertyValueRequired -> "Information is required for {0}"
,按照:
Asp.Net MVC 2 - Changing the PropertyValueRequired string
Changing the default ModelState error messages in ASP.NET MVC 3
StackOverflow上的示例表明它可以用于MVC DefaultModelBinder和DataAnnotations Validator。在上面的两个链接中,提问者表明他正在为DefaultModelBinder执行此操作(但无法使其他方面正常工作)。
不幸的是,它从MVC DefaultModelBinder输出{0}
逐字(我想要插入DisplayName)。
以上帖子是否具有误导性? MVC3是否支持PropertyValueInvalid但不支持PropertyValueRequired的格式字符串?按照惯例,我应该只使用DataAnnotation,如果我看到DefaultModelBinder消息,是否意味着我没有充分处理/装饰?
我认为,在下面的帖子中,Darin Dimitrov可能会说不可能使用模板。 Quote:“覆盖默认所需的错误消息...全局,这将是无用的。”
ASP.NET MVC - Custom validation message for value types
Dictionary<string, int>
一样,没有办法用验证消息来装饰(int)值,所以我得到一个通用的验证消息(DefaultModelBinder,而不是DataAnnotation) )对于每个字典成员。AddImplicitRequiredAttributeForValueTypes
作为解决我遇到的复选框和日期/时间绑定问题的常用方法,这似乎加剧了这种功能差异。答案 0 :(得分:2)
适合我。步骤进行:
App_GlobalResources/Messages.resx
添加Required => Information is required for {0}
装饰你的模特:
public class MyViewModel
{
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Messages))]
[DisplayName("Bar")]
public string Foo { get; set; }
}
在视图中将相应的字段留空:
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.Foo)
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<input type="submit" value="OK" />
}
如果您提交的表单为空,则会显示以下消息:Information is required for Bar
答案 1 :(得分:1)
答案是 MVC3不支持此。来自MVC来源:
PropertyValueInvalid
string displayName = propertyMetadata.GetDisplayName();
string errorMessageTemplate = GetValueInvalidResource(controllerContext);
string errorMessage = String.Format(CultureInfo.CurrentCulture, errorMessageTemplate, modelState.Value.AttemptedValue, displayName);
modelState.Errors.Remove(error);
modelState.Errors.Add(errorMessage);
PropertyValueRequired
bindingContext.ModelState.AddModelError(modelStateKey, GetValueRequiredResource(controllerContext));
我没有进一步观察,但我认为这可能与某些缺失值场景中缺少模型成员访问有关。