在MVC PropertyValueRequired格式字符串中发出DataAnnotations [DisplayName]?

时间:2011-03-16 21:22:57

标签: asp.net-mvc validation

期望的行为

模型中未修饰的非可空值类型属性会自动获取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作为解决我遇到的复选框和日期/时间绑定问题的常用方法,这似乎加剧了这种功能差异。
  • 在错误的未修饰字段的部分验证消息中查看名称有助于缩短调试时间。

2 个答案:

答案 0 :(得分:2)

适合我。步骤进行:

  1. App_GlobalResources/Messages.resx添加Required => Information is required for {0}
  2. 装饰你的模特:

    public class MyViewModel
    {
        [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Messages))]
        [DisplayName("Bar")]
        public string Foo { get; set; }
    }
    
  3. 在视图中将相应的字段留空:

    @using (Html.BeginForm())
    {
        @Html.LabelFor(x => x.Foo)
        @Html.EditorFor(x => x.Foo)
        @Html.ValidationMessageFor(x => x.Foo)
        <input type="submit" value="OK" />
    }
    
  4. 如果您提交的表单为空,则会显示以下消息: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));

我没有进一步观察,但我认为这可能与某些缺失值场景中缺少模型成员访问有关。