Asp.net mvc 如何让MVC远程验证工作

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

我有一个具有areaId属性的发票模型:

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”)]