在单独的项目中从验证类填充MVC视图模型

时间:2010-10-06 17:38:56

标签: c# asp.net-mvc

这是我的情况。我的解决方案结构如下。

Project用于处理路线,显示数据......

Project.Core用于处理业务逻辑,验证,查询......

Project.Core我有一个验证类来验证我的DTO(数据传输对象)。

我的验证课程(在Project.Core中):

public class IncidentValidator<T> : IValidator<T>
    where T : AuditReport
{
    public IncidentValidator(IList<T> ar)
    {
        AR = ar;
    }

    public IList<T> AR { get; set; }

    public IList<Model> Validate()
    {
        var list = new List<Model>();
        foreach (T ar in AR)
        {
            list.Add(new Model
                         {
                             IncidentId = new KeyValuePair<int, RuleType>(
                                 ar.IncidentId,
                                 new OccurrenceCountRule(ar).RulesValidate()
                                 ),
                             Circuit = new KeyValuePair<string, RuleType>(
                                 ar.Circuit,
                                 new CircuitRule(ar).RulesValidate()
                                 )
                         });
        }

        return list;
    }
}

我的观点模型(在Project中):

public class Model
{
    public KeyValuePair<int, RuleType> IncidentId { get; set; }
    public KeyValuePair<string, RuleType> Circuit { get; set; }
}

所以我的问题是,Project.Core引用Project是否可以访问我的视图模型,以便我的验证类可以填充它?然而,我并不喜欢这种方法。我已经考虑过在我的控制器内进行验证,但也不喜欢这个想法。也许我的视图模型可以存在于Project.Core内,还是被认为是糟糕的设计?

我该怎么办?

3 个答案:

答案 0 :(得分:2)

为每个视图模型类型创建一个接口,该接口位于Project.Core中,让实际视图模型实现接口并驻留在Project中。这样,您就可以在Project.Core中使用所需的内容进行验证,而无需关心实施。

答案 1 :(得分:2)

如果此验证程序类用于验证视图模型,则应将其放在与包含视图模型的项目相同的项目中。另一种可能性是将您的视图模型外部化为您在Project.Core中引用的单独程序集(虽然第一种方法似乎更好)。在任何情况下,您都不应在Project中引用Project.Core

答案 2 :(得分:1)

我想在控制器中执行此操作,创建一个管理验证过程的组件(框架现在无论如何都在控制器中验证),因此控制器不需要做很多工作,除了委托给另一个过程。此外,接口可以工作,或者您可以使用另一种设计模式进行验证。也许验证工厂可以包含验证器接口,但验证器逻辑与模型一起驻留在Project中。

HTH。