我的项目路线中有一个验证控制器,我试图在区域内使用模型属性的以下属性......
[Remote("IsValidUserName", "Validation", "", ErrorMessage = "Invalid username")]
但是当渲染时,验证是针对控制器“验证”的“IsValidUserName”操作,该操作位于与页面相同的区域内,而不是在根区域内...
数据-VAL-远程URL = “/成员/验证/ IsValidUserName”
任何帮助都将不胜感激。
感谢。
答案 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;
}
}
请注意IsNullOrWhiteSpace
对areaName
的最后一次测试是什么?
您可以通过编写自定义远程属性来修复它:
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")]