5

我有这个 ViewModel(简化):

public class ResponseViewModel {

    public QuestionViewModel Question { get; set; }
    public string Answer { get; set; }
}

public class QuestionViewModel {

    public string Text { get; set; }
    public string Description { get; set; }
    public bool IsRequired { get; set; }
}

QuestionViewModel 是从我的 DAL 实体 Question 映射的,这是一个直接的映射:

public class Question {

    public int Id { get; set; }
    public string Text { get; set; }
    public string Description { get; set; }
    public bool IsRequired { get; set; }
}

如果为真,我希望能够使Answer必需。Question.IsRequired但是在回发之后 Only 属性Answer被填充(当然)。

去这里的最佳方式是什么?我希望能够创建一个验证属性,但不知道如何实现。

更新:

我试图通过使用 ModelBinding 使其工作,但直到现在还没有成功。我做了什么:

public class EntityModelBinder : DefaultModelBinder
  protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        // IF I DO IT HERE I AM TOO EARLY
    }
  protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        base.OnModelUpdated(controllerContext, bindingContext);
        // IF I DO IT HERE I AM TOO LATE. VALIDATION ALREADY TOOK PLACE
    }
}
4

2 回答 2

6

也许RequiredÌf你需要一个属性。StackOverflow 上有几个关于此的问题。其中之一可以在这里找到:RequiredIf Conditional Validation Attribute

Darin 还指出了MSDN 上的一篇博文,其中包含该RequiredIf属性的实现。

使用此属性,您的视图模型将变为:

public class ResponseViewModel {

    public QuestionViewModel Question { get; set; }

    [RequiredIf("Question.IsRequired", true, "This question is required.")]
    public string Answer { get; set; }
}

我不确定我提供的实现是否支持复杂类型的属性(Question.IsRequired例如),但经过一些修改应该是可能的。

于 2013-10-18T10:02:35.937 回答
5

您可以使用IValidatableObject在类级别(在本例中为ResponseViewModel)执行验证,以便根据以下内容检查答案的有效性Question.IsRequired

public class ResponseViewModel : IValidatableObject
{
    public QuestionViewModel Question { get; set; }
    public string Answer { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Question.IsRequired && string.IsNullOrEmpty(Answer))
        {
            yield return new ValidationResult("An answer is required.");
        }
    }
}

但是,Question.IsRequired在验证过程中必须具有有效值。您可以通过将其作为隐藏输入放在您的视图中来做到这一点:

@Html.HiddenFor(m => m.Question.IsRequired)

默认模型绑定器将获得正确的值并正确执行验证。

于 2013-10-19T23:40:49.780 回答