Asp.net mvc 如何让MVC远程验证工作
我有一个具有areaId属性的发票模型:Asp.net mvc 如何让MVC远程验证工作,asp.net-mvc,validation,Asp.net Mvc,Validation,我有一个具有areaId属性的发票模型: public class Invoice : IEntity, IValidatableObject { ... [Required(ErrorMessage = "Region is a required field.")] [Display(Name = "Region:")] [Remote("Check","Invoice")] public virtual
public class Invoice : IEntity, IValidatableObject
{
...
[Required(ErrorMessage = "Region is a required field.")]
[Display(Name = "Region:")]
[Remote("Check","Invoice")]
public virtual int? AreaId { get; set; }
...
所以,我试图让远程验证在AreaId上工作
在我的发票控制器中,我设置:
public void Check(int id)
{
}
当我为一张发票插入时,我期望它会被击中,因为它会尝试验证
我验证时什么也没发生
我检查了fiddler,它在尝试访问/Invoice/Check/Invoice.AreaId=1时出现HTTP 500错误
我的检查方法从来没有这样做过。然而,我还是手动输入了URL Invoice/Check/1,它很好地到达了那里
有人知道我做错了什么吗?这就像它构造的Url完全错误一样。您要创建的Url实际上应该是
/Invoice/Check?AreaId=1
,因为您正在传递AreaId。我不确定它们是否是原因,但同时具有虚拟属性和返回void的函数可能会干扰远程验证,因此请将函数更改为返回JsonResult
,并将属性设置为非虚拟。将检查功能中的参数更改为AreaId
,而不是id
。此外,如果您创建了自定义路线,他们可能会将其填满
请尝试以下操作:。特别是题为“添加自定义远程验证”的部分,500代码是因为您的ajax url将是
/Invoice/Check?AreaID=1
,而您在方法签名中接受id,这也恰好是不可为空的。这就是为什么会抛出异常,并且在客户端得到500个代码。第二件事,void方法不会满足您的目的,因为它不会将值发送回客户端。然而,我无法想象它会成为我最疯狂梦想中的例外。此外,您可以将返回类型设置为JsonResult、String或ContentResult,以便向客户机发送适当的值,以便客户机检查其有效性
public string Check(int AreaID)
{
return "true";
}
public JsonResult Check(int AreaID)
{
return Json(true);
}
public ContentResult Check(int AreaID)
{
return Content("True");
}
还有一件事,当您手动键入Invoice/Check/1
时,1
将分配给id
路线值,前提是您尚未删除(我打赌您尚未删除)mvc应用程序附带的默认路线。这样,不可为null的参数id将获取值,并且不会引发异常。最终使用
[Bind(Prefix=“EditInvoiceViewModel.ActivityId”)]
从