ASP.NET MVC 3远程验证

use*_*344 15 validation asp.net-mvc-3

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

    [Remote("IsValidUserName", "Validation", "", ErrorMessage = "Invalid username")]
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助,将不胜感激.

谢谢.

Dar*_*rov 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意到最后的IsNullOrWhiteSpace测试是areaName什么杀了一切?

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

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

然后:

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

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

  • 或者作为Reflector的免费替代品我推荐[ILSpy](http://wiki.sharpdevelop.net/ILSpy.ashx). (2认同)

小智 9

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

System.Web.Mvc.AreaReference是一个ENUM,它有两个值UseRoot&UseCurrent 这里有更多细节

适用于我的示例用法:

[Remote("IsValidUserName", "Validation", System.Web.Mvc.AreaReference.UseRoot, ErrorMessage = "Invalid username")]
Run Code Online (Sandbox Code Playgroud)