4

私の 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ですか?

4

1 に答える 1

2

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();

もしかして?

于 2011-11-17T12:38:39.670 に答える