MVC4表单验证 - 自定义html消息howto?

时间:2012-11-13 14:32:52

标签: c# jquery asp.net-mvc validation

好吧,伙计们,我正在努力解决这个问题。我已经在MVC4和使用验证插件的jQuery中找到了香草形式验证(突出显示文本框和显示红色文本)的示例,但是,在尝试自定义样式的东西时它们没有太大帮助。

示例,在ajax形式中,当用户提交表单,并且参数错误时(在帖子后的控制器中),我想在页面上显示一个自定义HTML元素 - 一个内部有文本的div这样,我可以适当地为我的网站设置div。

在寻找答案的过程中,我发现了ModelState.AddModelError() - 如果你只想显示文本而不是div,这很好,因为它只是添加了一个我可以设计的页面,但是我需要不只是一个出现。

有没有人有这方面的好演示/示例?

我添加了一个简单的示例图片,如果密码不正确,我想在右边显示消息(html和css的组合):

enter image description here

2 个答案:

答案 0 :(得分:1)

在您的视图中,您可以使用ValidationMessageFor并添加一些类。要使用此功能,请确保使用AddModelError指定了正确的属性名称,或者在与TryValidateModel()

组合的类中使用了元数据验证

查看代码:

@Html.ValidationMessageFor(model => model.PropertyX, null, new { @class ="error-propertyx" })

验证型号代码:

[Required(ErrorMessageResourceName = "RequiredField", ErrorMessageResourceType = typeof(ValidationRes))]
public string PropertyX { get; set; }

或者,如果您想要更多参与的内容,您可以使用以下方法

http://buildstarted.com/2010/09/14/creating-your-own-modelmetadataprovider-to-handle-custom-attributes/

创建一个单独的扩展方法也是一个选项,请注意,这不是最优化的代码,但它会做你想要的:)

public static MvcHtmlString CustomValidatioMessageFor<TModel, TProperty>(this HtmlHelper obj, Expression<Func<TModel,TProperty>> expression){

    string html = (string)obj.ValidationMessageFor(expression);
    html = "<div>" + html + "</div>";
    return new MvcHtmlString(html);
}

答案 1 :(得分:-1)

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public sealed class CCompareAttribute : ValidationAttribute, IClientValidatable
    {
        private const string _defaultErrorMessage = "Confirm password should match with password field.";
        private readonly int _minCharacters = Membership.Provider.MinRequiredPasswordLength;
        private string name;

        public CCompareAttribute(string compare)
            : base(_defaultErrorMessage)
        {
            name = compare;
        }

        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentCulture, ErrorMessageString);
        }

        public override bool IsValid(object value)
        {
            string valueAsString = value as string;
            return (valueAsString != null);
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            return new[]{
            new ModelClientValidationEqualToRule(FormatErrorMessage(metadata.GetDisplayName()),name)
        };
        }
    }




    [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)]
    public class TypeErrorMessageAttribute : Attribute
    {
        public string ErrorMessage { get; set; }
        public string ErrorMessageResourceName { get; set; }
        public Type ErrorMessageResourceType { get; set; }

        public TypeErrorMessageAttribute()
        {
        }

        public string GetErrorMessage()
        {
            PropertyInfo prop = ErrorMessageResourceType.GetProperty(ErrorMessageResourceName);
            return prop.GetValue(null, null).ToString();
        }
    }