【问题标题】:How do I get the Validation message to disappear after adding a model error MVC?添加模型错误 MVC 后,如何使验证消息消失?
【发布时间】:2013-12-10 17:06:37
【问题描述】:

在我看来,我有一个复选框和一个文本框,如果选中该复选框,那么我需要在文本框中填充一些文本。为此,我调用了

ModelState.AddModelError("item", "Please enter some text.");

仅当复选框返回 true 且文本框为空时 当我的页面重新显示时,我会收到正确的消息

@Html.ValidationMessageFor(model => model.item)

但我希望文本在使用后在文本框中输入内容后消失,而用户不必像使用数据注释那样点击提交。我该如何解决这个问题?

我正在使用 c# Asp.net 4 和实体框架 5

【问题讨论】:

  • 您能详细说明一下吗?你是什​​么意思你想让文字消失?你的意思是当用户输入有效数据后重新提交?
  • @mayabelle 不,我的意思是像常规数据注释一样工作
  • 您是否启用了客户端验证
  • @qwr 是的,设置为 true
  • @Bob 使用数据注释。见 mayabelle 添加了一些示例

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

ModelState.AddModelError 是服务器端验证,因此在您发布到服务器之前,错误消息不会消失。

如果您想要您描述的功能,您可以定义一个自定义验证属性并将其应用于客户端和服务器端。例如,您可以定义一个“RequiredIf”自定义验证属性,如果满足某个其他条件(在这种情况下,如果另一个属性为真),它将使字段成为必需:

public class RequiredIfAttribute : RequiredAttribute
    {
        private String PropertyName { get; set; }
        private Object DesiredValue { get; set; }

        public RequiredIfAttribute(String propertyName, Object desiredvalue)
        {
            PropertyName = propertyName;
            DesiredValue = desiredvalue;
        }

        protected override ValidationResult IsValid(object value, ValidationContext context)
        {
            Object instance = context.ObjectInstance;
            Type type = instance.GetType();
            Object proprtyvalue = type.GetProperty(PropertyName).GetValue(instance, null);
            if (proprtyvalue.ToString() == DesiredValue.ToString())
            {
                 ValidationResult result = base.IsValid(value, context);
                return result;
            }
            return ValidationResult.Success;
        }
    }

在你的 global.asax 中注册:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute),typeof(RequiredAttributeAdapter);

那么你可以这样使用它:

public class YourModel {
    // This is the property tied to your checkbox
    public bool YourBooleanProperty { get; set; }

    [RequiredIf("YourBooleanProperty", true)]
    public string Item { get; set; }
}

您还可以利用 JQuery Validate 插件在客户端执行相同的条件验证。

【讨论】:

  • 您的解决方案运行良好,但是当我将它应用到我的模型时,它想要在数据库中创建所需的列,我该如何解决这个问题?
  • 这就是视图模型和域模型应该分开的原因。我强烈建议将视图模型用于显示目的,即使属性相同或相似,以分离关注点并避免此类问题。如果在写入数据库之前有一个,您可以在控制器或中间层中将视图模型转换为域模型。
  • 所以您建议制作两个与模型相同的视图模型,然后在控制器中将实际模型设置为等于视图模型?
  • 您必须复制属性。您可以使用 AutoMapper (github.com/AutoMapper/AutoMapper) 来简化此操作。此外,您的视图模型和域模型不一定必须相同(通常不会相同) - 您的视图模型应该严格符合显示目的。查看这个问题的答案:stackoverflow.com/questions/6185508/…
【解决方案2】:

尝试使用 jquery,将 eventListener 附加到字段并删除 MVC 添加到字段的类 CSS 并隐藏验证标签

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2016-03-27
    相关资源
    最近更新 更多