【问题标题】:Custom Validation : get the property name from validationContext自定义验证:从 validationContext 获取属性名称
【发布时间】:2011-11-08 10:18:28
【问题描述】:

对于我的 ASP.NET MVC 项目,我创建了一个自定义验证属性。这是我正在努力的代码:

  protected override ValidationResult IsValid(object value, ValidationContext validationContext) {

        //Here I need to resolve the url in order to make a call to that controller action and get the JSON result back

        var httpContext = new HttpContextWrapper(HttpContext.Current);
        var urlHelper = new UrlHelper(
            new System.Web.Routing.RequestContext(
                httpContext, new System.Web.Routing.RouteData()
            )
        );
        var url = urlHelper.Action(Action, Controller, null, 
            urlHelper.RequestContext.HttpContext.Request.Url.Scheme);

        var fullUrl = string.Format("{0}?{1}={2}", url, 
            /*validationContext.MemberName*/"term", value);

        if (!GetResult(fullUrl)) {

            var message = FormatErrorMessage(validationContext.DisplayName);
            return new ValidationResult(message);
        }

        return null;
    }

您可以从以下链接查看完整代码:

https://bitbucket.org/tugberk/tugberkug.mvc/src/6cc3d3d64721/TugberkUg.MVC/Validation/ServerSideRemoteAttribute.cs

对于fullUrl 变量,我试图将属性名称附加到查询字符串,但是当我使用validationContext.MemberName 时,我失败了。我通过将其设为静态作为“术语”解决了临时修复的问题,但它根本不是修复。

那么,从validationContext 中检索属性名称的方法是什么?

【问题讨论】:

  • 我也有同样的问题。我什至想更进一步,获取正在验证的属性的所有 CustomAttributes。遗憾的是,validationContext 不包含任何可用的属性/方法来获取此信息。
  • 这里有更多详细信息:stackoverflow.com/questions/7447932/…

标签: asp.net .net asp.net-mvc asp.net-mvc-3 asp.net-mvc-validation


【解决方案1】:

validationContext.DisplayName 能解决问题吗?

然后您可以通过反射来获取 MemberName

var displayName = validationContext.DisplayName;

var memberName = validationContext.ObjectType.GetProperties()
    .Where(p => p.GetCustomAttributes(false).OfType<DisplayAttribute>().Any(a => a.Name == displayName))
    .Select(p => p.Name)
    .FirstOrDefault();

可能吗?

【讨论】:

  • DisplayName 和 MemberName 不同。
  • 是的,你说的很对——在我的代码中,我必须在能够访问成员的名称(通过 DisplayName)和在该成员上拥有 DisplayAttribute 之间做出选择。不过,我将使用可能的解决方案编辑我的答案
  • 对不起,今天很忙 - 我应该更小心地回复:)
  • 没问题 :) 嗯,我一定会试一试的。如果你愿意,你也可以发送一个补丁:bitbucket.org/tugberk/tugberkug.mvc/src/6cc3d3d64721/…
  • 更多信息在这里:stackoverflow.com/questions/7447932/…
猜你喜欢
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
相关资源
最近更新 更多