C# 简单的ASP.NETMVC1.0验证
在我们目前正在进行的项目中,我们还没有升级到MVC2.0,所以我正在使用1.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)
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(此项除外