ASP.NET MVC 3远程验证

时间:2011-03-13 13:47:02

标签: validation asp.net-mvc-3

我的项目路线中有一个验证控制器,我试图在区域内使用模型属性的以下属性......

    [Remote("IsValidUserName", "Validation", "", ErrorMessage = "Invalid username")]

但是当渲染时,验证是针对控制器“验证”的“IsValidUserName”操作,该操作位于与页面相同的区域内,而不是在根区域内...

数据-VAL-远程URL = “/成员/验证/ IsValidUserName”

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:31)

不幸的是,这个属性是如何实现的。以下是此属性的构造函数的摘录:

public RemoteAttribute(string action, string controller, string areaName) : this()
{
    if (string.IsNullOrWhiteSpace(action))
    {
        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "action");
    }
    if (string.IsNullOrWhiteSpace(controller))
    {
        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "controller");
    }
    this.RouteData["controller"] = controller;
    this.RouteData["action"] = action;
    if (!string.IsNullOrWhiteSpace(areaName))
    {
        this.RouteData["area"] = areaName;
    }
}

请注意IsNullOrWhiteSpaceareaName的最后一次测试是什么?

您可以通过编写自定义远程属性来修复它:

public class MyRemoteAttribute : RemoteAttribute
{
    public MyRemoteAttribute(string action, string controller, string area)
        : base(action, controller, area)
    {
        this.RouteData["area"] = area;
    }
}

然后:

[MyRemote("IsValidUserName", "Validation", "", ErrorMessage = "Invalid username")]
public string Username { get; set; }

现在将生成正确的data-val-remote-url="/Validation/IsValidUserName"

答案 1 :(得分:9)

我遇到了同样的问题,找到了适合我的解决方案。 remote属性采用AreaReference枚举。

System.Web.Mvc.AreaReference是一个ENUM,它有两个值UseRoot&使用当前更多详细信息here

适用于我的示例用法:

[Remote("IsValidUserName", "Validation", System.Web.Mvc.AreaReference.UseRoot, ErrorMessage = "Invalid username")]