【问题标题】:MVC conditional Required fieldMVC 条件 必填字段
【发布时间】:2017-12-24 22:28:15
【问题描述】:

在我的程序中,对于一个实体,我有一个保存和一个提交按钮。 对于我的实体,我有一个字段来确定是否需要另一个字段。这种情况的一个例子:

public class Question{
bool IsRequired {get; set;}
string Answer {get; set;}
}

我知道我可以根据 IsRequired 字段制作自定义验证属性以使 Answer 成为必需,但问题是,我只希望在用户“提交”表单时进行此验证,而不仅仅是保存它。
验证实体服务器端的最佳方法是什么? 我正在考虑在我的服务类中创建一个 IsValid 方法并返回一个错误列表,然后将其添加到控制器中的 ModelState 中。或者,也许使用自定义验证属性并在客户端执行它,并在单击保存时以某种方式禁用验证,并为提交按钮启用它。 似乎应该有一个更优雅的解决方案。有人有什么建议吗?

编辑:这是我用于属性的代码:

 public class RequiredIfAttribute : ValidationAttribute
    {

        RequiredAttribute _innerAttribute = new RequiredAttribute();
        private string _dependentProperty { get; set; }
        private object _targetValue { get; set; }

        public RequiredIfAttribute(string dependentProperty, object targetValue)
        {
            this._dependentProperty = dependentProperty;
            this._targetValue = targetValue;
        }
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var field = validationContext.ObjectType.GetProperty(_dependentProperty);
            if (field != null)
            {
                var dependentValue = field.GetValue(validationContext.ObjectInstance, null);
                if ((dependentValue == null && _targetValue == null) || (dependentValue.Equals(_targetValue)))
                {
                    if (!_innerAttribute.IsValid(value))
                    {
                        string name = validationContext.DisplayName;
                        return new ValidationResult(ErrorMessage = name + " Is required.");
                    }
                }
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult(FormatErrorMessage(_dependentProperty));
            }
        }

    }

控制器方法:

 public ActionResult FormDetail(UserFormDTO model, string buttonType)
    {
        if (buttonType == "Save")
        {                
            if (!ModelState.IsValid)
            {
                return FormDetail(model.UserFormID);
            }

           //Save code is here                
        }
        else if (buttonType == "Submit")
        {
            if (!ModelState.IsValid)
            {
                return FormDetail(model.UserFormID);
            }

           //Submit code is here
        }

        return RedirectToAction("Forms");
    }

UserFormDTO 有一个问题列表。

【问题讨论】:

  • 您的编辑数据因此始终使用视图模型。游览视图模型将具有 [ RequiredIf] 属性。
  • 我已经研究过使用自定义数据注释,但是如果单击保存按钮,我将如何阻止它验证是否单击了提交按钮?

标签: asp.net asp.net-mvc validation


【解决方案1】:

为了适合您当前的设计,即根据IsRequired 确定Answer 是否是强制性的,您需要根据单击的按钮设置IsRequired 值。这是一种方法:

<button name="IsRequired" value="false">Save</button>
<button name="IsRequired" value="true">Submit</button>

EDIT 更新Question 类以使用RequiredIf 属性来验证模型。请注意,RequiredIf 来自 MVC Foolproof Validation 包。

public class Question
{
    public bool IsRequired { get; set; }

    [RequiredIf("IsRequired", true)]
    public string Answer { get; set; }
}

另外,按照惯例,属性类的名称应该以'Attribute'结尾以增加代码的可读性,所以最好将RequiredIf类名改为RequireIfAttribute

public class RequiredIfAttribute : ValidationAttribute

在模型中应用属性时不必包含Attribute后缀(如上代码所示),编译可以识别属性类。

【讨论】:

  • 这会将值传递给控制器​​的 post 方法。我如何将它传递给模型自定义验证属性?
  • 您使用的是什么自定义验证属性?可以发一下代码吗?
  • 我用更多代码更新了我的问题。从验证上下文中,我无法访问模型变量。只是问题。
猜你喜欢
  • 2019-03-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2019-03-15
  • 2021-08-27
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多