use*_*551 2 asp.net validation asp.net-mvc
在我的程序中,对于一个实体,我有一个保存和一个提交按钮。对于我的实体,我有一个字段来确定是否不需要另一个字段。这种情况的一个例子:
public class Question{
bool IsRequired {get; set;}
string Answer {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以根据 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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
控制器方法:
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");
}
Run Code Online (Sandbox Code Playgroud)
UserFormDTO 有一个问题列表。
小智 6
为了适合您当前的设计,即根据 确定是否Answer
是强制性的IsRequired
,您需要根据IsRequired
单击的按钮设置值。这是一种方法:
<button name="IsRequired" value="false">Save</button>
<button name="IsRequired" value="true">Submit</button>
Run Code Online (Sandbox Code Playgroud)
编辑更新Question
类以使用该RequiredIf
属性来验证模型。请注意,RequiredIf
来自MVC 万无一失的验证包。
public class Question
{
public bool IsRequired { get; set; }
[RequiredIf("IsRequired", true)]
public string Answer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
另外,按照惯例,属性类的名称应该以'Attribute'结尾以增加代码可读性,所以最好将RequiredIf
类名更改为RequireIfAttribute
public class RequiredIfAttribute : ValidationAttribute
Run Code Online (Sandbox Code Playgroud)
Attribute
在模型中应用属性时不必包含后缀(如上面的代码所示),编译可以识别属性类。
归档时间: |
|
查看次数: |
5813 次 |
最近记录: |