C# 简单的ASP.NETMVC1.0验证

C# 简单的ASP.NETMVC1.0验证,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,在我们目前正在进行的项目中,我们还没有升级到MVC2.0,所以我正在使用1.0中提供的工具实现一些简单的验证 我正在寻找关于我这样做的反馈 我有一个表示用户配置文件的模型。在该模型中,我有一个方法可以验证所有字段等。我要做的是将控制器传递给验证方法,以便模型可以在控制器中设置模型验证属性。目标是将验证从控制器输入到模型中 下面是一个简单的例子 public FooController : Controller { public ActionResult Edit(User user)

在我们目前正在进行的项目中,我们还没有升级到MVC2.0,所以我正在使用1.0中提供的工具实现一些简单的验证

我正在寻找关于我这样做的反馈

我有一个表示用户配置文件的模型。在该模型中,我有一个方法可以验证所有字段等。我要做的是将控制器传递给验证方法,以便模型可以在控制器中设置模型验证属性。目标是将验证从控制器输入到模型中

下面是一个简单的例子

public FooController : Controller
{
     public ActionResult Edit(User user)
     {
          user.ValidateModel(this);

          if (ModelState.IsValid)
               .......
               .......
      }
}
我的模型验证签名如下

public void ValidateModel(Controller currentState)

你认为这有什么问题?我是不是可以出去吃午餐,谈谈我想怎么做?

我发现这种方法存在的问题是,您的验证逻辑与控制器耦合。实际上,验证器不需要控制器,只需要一个
IDictionary
来设置错误

我建议您查看允许您将验证逻辑与控制器完全解耦的。它使用一个模型绑定器,在该绑定器中可以访问控制器以设置错误

因此,您的操作代码如下所示:

public FooController : Controller
{
     public ActionResult Edit(User user)
     {
         if (ModelState.IsValid)
         {

         }
         return View();
     }
}

绑定期间会添加模型错误。演示此库与ASP.NET MVC的集成。您的验证逻辑也非常简单易读。

对于MVC 1.0项目,我们执行以下操作:

/* In model class */

public void Validate(string dealerId)
{
    ExceptionList exceptions = new ExceptionList();

    if (String.IsNullOrEmpty(this.UserName))
    {
        exceptions.Exceptions.Add(new InvalidFieldException("Error message", "ContractType"));
    }

    ... other validations ...

    if (exceptions.Exceptions.Count > 0)
    {
        throw exceptions;
    }
}


/* In controller */

public virtual ActionResult UpdateProfile(User user)
{

    try
    {
        user.Validate();
    }
    catch (ExceptionList ex)
    {
        ex.CopyToModelState(ModelState);
    }
}


/* Custom types (ExceptionList / InvalidFieldException) */

[Serializable]
public class ExceptionList : Exception
{
    private List<Exception> exceptions;
    public List<Exception> Exceptions
    {
        get { return exceptions; }
        set { exceptions = value; }
    }

    public ExceptionList() { Init(); }
    public ExceptionList(string message) : base(message) { Init(); }
    public ExceptionList(string message,
        System.Exception inner)
        : base(message, inner) { Init(); }
    protected ExceptionList(
        System.Runtime.Serialization.SerializationInfo info,
        System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { Init(); }


    private void Init()
    {
        Exceptions = new List<Exception>();
    }
}

[Serializable]
public class InvalidFieldException : Exception
{
    private string fieldName;
    public string FieldName
    {
        get
        {
            return fieldName;
        }
        set
        {
            fieldName = value;
        }
    }

    private string fieldId;
    public string FieldId
    {
        get
        {
            return fieldId;
        }
        set
        {
            fieldId = value;
        }
    }

    public InvalidFieldException() { }
    public InvalidFieldException(string message) : base(message) { }
    public InvalidFieldException(string message, string fieldName)
        : base(message)
    {
        this.fieldName = fieldName;
    }
    public InvalidFieldException(string message, string fieldName, string fieldId)
        : base(message)
    {
        this.fieldName = fieldName;
        this.fieldId = fieldId;
    }
    public InvalidFieldException(string message, System.Exception inner)
        : base(message, inner) { }
    public InvalidFieldException(string message, string fieldName,
        System.Exception inner)
        : base(message, inner)
    {
        this.fieldName = fieldName;
    }
    public InvalidFieldException(string message, string fieldName, string fieldId,
         System.Exception inner)
        : base(message, inner)
    {
        this.fieldName = fieldName;
        this.fieldId = fieldId;
    }


    protected InvalidFieldException(
        System.Runtime.Serialization.SerializationInfo info,
        System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}


/* Extension method (to copy ExceptionList exceptions to ModelState) */

/// <summary>
/// Copies an ExceptionList to ModelState for MVC
/// </summary>
/// <param name="exList">List of exceptions</param>
/// <param name="modelState">Model state to populate</param>
/// <param name="collection">Form collection of data posted to the action</param>
/// <param name="prefix">Prefix used in view (if any)</param>
/// <param name="isCollection">Indicates whether a collection of objects are being returned from the view (requires prefix)</param>
[CLSCompliant(false)]
public static void CopyToModelState(this ExceptionList exList, ModelStateDictionary modelState, FormCollection collection, string prefix, bool isCollection)
{
    foreach (InvalidFieldException ex in exList.Exceptions)
        if (String.IsNullOrEmpty(prefix))
        {
            modelState.AddModelError(ex.FieldName, ex.Message);
            modelState.SetModelValue(ex.FieldName, collection.ToValueProvider()[ex.FieldName]);
        }
        else
        {
            if (isCollection)
            {
                modelState.AddModelError(prefix + "[" + ex.FieldId + "]." + ex.FieldName, ex.Message);
                modelState.SetModelValue(prefix + "[" + ex.FieldId + "]." + ex.FieldName, collection.ToValueProvider()[ex.FieldName]);
            }
            else
            {
                modelState.AddModelError(prefix + "." + ex.FieldName, ex.Message);
                modelState.SetModelValue(prefix + "." + ex.FieldName, collection.ToValueProvider()[ex.FieldName]);
            }
        }
}

    /// <summary>
    /// Copies an ExceptionList to ModelState for MVC
    /// </summary>
    /// <param name="exList">List of exceptions</param>
    /// <param name="modelState">Model state to populate</param>
    [CLSCompliant(false)]
    public static void CopyToModelState(this ExceptionList exList, ModelStateDictionary modelState)
    {
        CopyToModelState(exList, modelState, null, false);
    }

    /// <summary>
    /// Copies an ExceptionList to ModelState for MVC
    /// </summary>
    /// <param name="exList">List of exceptions</param>
    /// <param name="modelState">Model state to populate</param>
    /// <param name="collection">Form collection of data posted to the action</param>
    [CLSCompliant(false)]
    public static void CopyToModelState(this ExceptionList exList, ModelStateDictionary modelState, FormCollection collection)
    {
        CopyToModelState(exList, modelState, collection, null, false);
    }
模型类中的
/**/
公共void验证(字符串dealerId)
{
ExceptionList exceptions=新的ExceptionList();
if(String.IsNullOrEmpty(this.UserName))
{
异常。异常。添加(新的InvalidFieldException(“错误消息”、“合同类型”);
}
…其他验证。。。
如果(exceptions.exceptions.Count>0)
{
抛出异常;
}
}
/*内部控制器*/
公共虚拟操作结果更新配置文件(用户)
{
尝试
{
user.Validate();
}
捕获(例外列表ex)
{
例如CopyToModelState(ModelState);
}
}
/*自定义类型(例外列表/InvalidFieldException)*/
[可序列化]
公共类异常列表:异常
{
私人名单例外情况;
公开名单例外情况
{
获取{返回异常;}
设置{exceptions=value;}
}
公共例外列表(){Init();}
公共例外列表(字符串消息):基(消息){Init();}
公共例外列表(字符串消息,
系统异常(内部)
:base(消息,内部){Init();}
受保护例外列表(
System.Runtime.Serialization.SerializationInfo,
System.Runtime.Serialization.StreamingContext(上下文)
:base(info,context){Init();}
私有void Init()
{
异常=新列表();
}
}
[可序列化]
公共类InvalidFieldException:异常
{
私有字符串字段名;
公共字符串字段名
{
得到
{
返回字段名;
}
设置
{
字段名=值;
}
}
私有字符串字段ID;
公共字符串字段ID
{
得到
{
返回字段ID;
}
设置
{
fieldId=值;
}
}
公共InvalidFieldException(){}
公共InvalidFieldException(字符串消息):基(消息){}
公共InvalidFieldException(字符串消息、字符串字段名)
:base(消息)
{
this.fieldName=字段名;
}
公共InvalidFieldException(字符串消息、字符串字段名、字符串字段ID)
:base(消息)
{
this.fieldName=字段名;
this.fieldId=fieldId;
}
公共InvalidFieldException(字符串消息,System.Exception内部)
:base(消息,内部){}
公共InvalidFieldException(字符串消息、字符串字段名、,
系统异常(内部)
:base(消息,内部)
{
this.fieldName=字段名;
}
公共InvalidFieldException(字符串消息、字符串字段名、字符串字段ID、,
系统异常(内部)
:base(消息,内部)
{
this.fieldName=字段名;
this.fieldId=fieldId;
}
受保护的无效字段异常(
System.Runtime.Serialization.SerializationInfo,
System.Runtime.Serialization.StreamingContext(上下文)
:base(信息,上下文){}
}
/*扩展方法(将ExceptionList异常复制到ModelState)*/
/// 
///将例外列表复制到MVC的ModelState
/// 
///例外情况清单
///要填充的模型状态
///表单已过帐到操作的数据集合
///视图中使用的前缀(如果有)
///指示是否从视图返回对象集合(需要前缀)
[CLSCompliant(false)]
公共静态void CopyToModelState(此例外列表exList、ModelStateDictionary modelState、FormCollection集合、字符串前缀、bool isCollection)
{
foreach(exList.Exceptions中的InvalidFieldException ex)
if(String.IsNullOrEmpty(前缀))
{
AddModelError(例如FieldName,例如Message);
modelState.SetModelValue(例如FieldName,collection.ToValueProvider()[ex.FieldName]);
}
其他的
{
if(isCollection)
{
modelState.AddModelError(前缀+“[”+ex.FieldId+“]。”+ex.FieldName,ex.Message);
modelState.SetModelValue(前缀+“[”+ex.FieldId+“]。“+ex.FieldName,集合.ToValueProvider()[ex.FieldName]);
}
其他的
{
modelState.AddModelError(前缀+“+”ex.FieldName,ex.Message);
modelState.SetModelValue(前缀+“+”ex.FieldName,collection.ToValueProvider()[ex.FieldName]);
}
}
}
/// 
///将例外列表复制到MVC的ModelState
/// 
///例外情况清单
///要填充的模型状态
[CLSCompliant(false)]
公共静态void CopyToModelState(此项除外