我有这样的自定义验证属性:
public class SCIRequired : RequiredAttribute, IClientValidatable
{
private string LocalizedErrorMessage(string fieldName)
{
string e = "Required";
try
{
e = HttpUtility.HtmlDecode(String.Format(@Resources.ModelValidationErrors.Required, fieldName));
}
catch (Exception) { }
return e;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
ErrorMessage = LocalizedErrorMessage(validationContext.DisplayName);
return base.IsValid(value, validationContext);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRequiredRule(LocalizedErrorMessage(metadata.DisplayName));
return new[] { rule };
}
}
这可以正常工作,直到我禁用javascript。
发布页面时,属性代码在设置CurrentCulture之前运行,因此无法获得正确的本地化字符串。
启用javascript后,它运行正常。这是因为当我第一次访问页面时(不是POST),属性由于某种原因知道当前的文化。这些本地化消息在渲染时被加载并成为HTML的一部分。
当需要再次加载属性错误时,问题仅适用于POSTS。
*的 修改 * 启用javascript时,这仍然是一个问题。有没有办法从POST上的自定义验证属性获取当前文化?
我怎样才能解决这个问题?
* 编辑2 * 弹出的错误消息是英文。当我在调试模式中单步执行代码时,我可以看到错误字符串被加载,我还可以看到CurentCulture被设置为Web配置中描述的默认值。 (我在Session中保存当前用户选择的语言。出于某种原因,调用验证属性时,CurrentCulture或Session不可用)
我原来的doc类型设置为HTML5
我现在将它设置为Strict
在代码中更改doctype似乎没有效果。
我一直在尝试不同的东西,看起来这真的是由于文档模式设置为低于IE9的任何东西。 (我正在使用IE9开发人员工具更改文档模式( F12 ))