7

バニラ MVC を使用して、TryValidateModel でモデルを再検証できます。TryValidateModel メソッドは WebAPI には適用できないようです。WebAPI を使用しているときにモデルを再検証するにはどうすればよいですか?

4

4 に答える 4

5

いつ追加されたのかわかりませんが、API コントローラーに Validate メソッドが追加されました。

ApiController.Validate メソッド (TEntity) https://msdn.microsoft.com/en-us/library/dn573258%28v=vs.118%29.aspx

于 2015-06-11T21:36:17.063 に答える
3

rik-vanmechelenの元の回答に基づいて、Web API によって公開されたサービス コンテナーに依存する私のバージョンを次に示します。

    /// <summary>
    /// Tries to validate the model.
    /// </summary>
    /// <param name="model">The model.</param>
    /// <returns>Whether the model is valid or not.</returns>
    protected internal bool TryValidateModel(object model)
    {
        if (model == null)
        {
            throw new ArgumentNullException("model");
        }

        var metadataProvider = Configuration.Services.GetService<System.Web.Http.Metadata.ModelMetadataProvider>();
        var validatorProviders = Configuration.Services.GetServices<System.Web.Http.Validation.ModelValidatorProvider>();
        var metadata = metadataProvider.GetMetadataForType(() => model, model.GetType());

        ModelState.Clear();
        var modelValidators = metadata.GetValidators(validatorProviders);
        foreach (var validationResult in modelValidators.SelectMany(v => v.Validate(metadata, null)))
        {
            ModelState.AddModelError(validationResult.MemberName, validationResult.Message);
        }

        return ModelState.IsValid;
    }

これは、次の単純な拡張メソッドを使用してサービスにアクセスします。

  /// <summary>
  /// Services container extension methods.
  /// </summary>
  public static class ServicesContainerExtensions
  {
    /// <summary>
    /// Gets the service.
    /// </summary>
    /// <typeparam name="TService">The type of the service.</typeparam>
    /// <param name="services">The services.</param>
    /// <returns>The service.</returns>
    /// <exception cref="System.ArgumentNullException">services</exception>
    public static TService GetService<TService>(this ServicesContainer services)
    {
        if (services == null)
        {
            throw new ArgumentNullException("services");
        }
        return (TService)((object)services.GetService(typeof(TService)));
    }

    /// <summary>
    /// Gets the services.
    /// </summary>
    /// <typeparam name="TService">The type of the service.</typeparam>
    /// <param name="services">The services.</param>
    /// <returns>The services.</returns>
    /// <exception cref="System.ArgumentNullException">services</exception>
    public static IEnumerable<TService> GetServices<TService>(this ServicesContainer services)
    {
        if (services == null)
        {
            throw new ArgumentNullException("services");
        }
        return services.GetServices(typeof(TService)).Cast<TService>();
    }
}

このメソッドを使用する利点は、Web API アプリケーション用に構成した MetadataProvider と ValidatorProvider(s) を再利用することですが、前の回答では ASP.NET MVC で構成したものを取得しています。ASP.NET MVC と WebAPI は、異なるパイプラインを介して実行されます。

于 2013-11-05T04:13:50.583 に答える
1

TryValidateModelはWebAPIではサポートされていないことがわかりました。CodePlexに機能リクエストがあります。

于 2012-10-19T08:43:48.737 に答える