MVC自定义属性在设置当前区域性之前运行

时间:2012-03-30 19:38:48

标签: c# javascript model-view-controller validation localization

我有这样的自定义验证属性:

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 ))

0 个答案:

没有答案