2016-07-19 31 views
0

私はModelState.IsValidを使用して入力を検証:無効にModelStateエラーメッセージ

[HttpGet] 
[Route("subjects")] 
[ValidateAttribute] 
public IHttpActionResult GetSubjects(bool? isActive = null) 
{ 
    //get subjects 
} 

私はURI ~/subjects/?isActive=abcdefに渡すと、私はエラーメッセージが出ます:

値である「ABCDEF」をNullable`1には有効ではありません。

'ABCDEF' の値ブールに対して有効ではありません:入力パラメータが

public IHttpActionResult GetSubjects(bool isActive){ 
    //get subjects 
} 

NULL可能でない場合

は、私はエラーメッセージが表示されます。

null可能な型のメッセージをオーバーライドしたいので、メッセージを保持することができます( "値 'abcdef'はブール値に対して無効です)。 ModelStateエラーでデータ型を取得できないため、どうすればこのことができますか。妥当性確認をカスタムActionFilterAttributeValidationAttribute)として実装しています。

+0

アクションフィルタ属性でコントローラにアクションメソッドを飾ります。 – lorond

+0

私は "値 'abcdef'はブール値に対して有効ではありません"というように設定することができますが、問題はエラーオブジェクトが検証されているパラメータの型情報(bool、intなど)を持たないことです。 – alltej

答えて

2

タイプ変換エラーメッセージをフォーマットするコールバックを変更できます。たとえば、のは、Global.asax.csに右のそれを定義してみましょう:Nullable.GetUnderlyingTypeはnullを返しますNULL可能でないタイプの場合

public class WebApiApplication : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     ModelBinderConfig.TypeConversionErrorMessageProvider = this.NullableAwareTypeConversionErrorMessageProvider; 

     // rest of your initialization code 
    } 

    private string NullableAwareTypeConversionErrorMessageProvider(HttpActionContext actionContext, ModelMetadata modelMetadata, object incomingValue) 
    { 
     var target = modelMetadata.PropertyName; 
     if (target == null) 
     { 
      var type = Nullable.GetUnderlyingType(modelMetadata.ModelType) ?? modelMetadata.ModelType; 
      target = type.Name; 
     } 

     return string.Format("The value '{0}' is not valid for {1}", incomingValue, target); 
    } 
} 

を、このケースでは、我々は元の型を使用します。

残念ながら、デフォルトの文字列リソースにアクセスすることはできません。エラーメッセージをローカライズする必要がある場合は、それを自分で行う必要があります。

もう1つの方法は、独自のIModelBinderを実装することですが、これはあなたの特定の問題のための良い考えではありません。

0

Lorondの答えは、プログラマがAPIの多くの部分をカスタマイズできるという点で、柔軟なasp.net web apiがどのように優れているかを強調しています。私はこの質問を見て、私の思考プロセスは、構成内の何かを上書きするのではなく、アクションフィルターでそれを処理することでした。

public class ValidateTypeAttribute : ActionFilterAttribute 
{ 
    public ValidateTypeAttribute() { } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     string somebool = actionContext.Request.GetQueryNameValuePairs().Where(x => x.Key.ToString() == "somebool").Select(x => x.Value).FirstOrDefault(); 

     bool outBool; 
     //do something if somebool is empty string 
     if (!bool.TryParse(somebool, out outBool)) 
     { 
      HttpResponseMessage response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest); 
      response.ReasonPhrase = "The value " + somebool + " is not valid for Boolean."; 
      actionContext.Response = response; 
     } 
     else 
     { 
      base.OnActionExecuting(actionContext); 
     } 
    } 

次にあなたが `ModelState`にしたいすべてのエラーメッセージを設定することができ

+0

「somebool」はここではハードコードされています。なぜなら、私は異なるコントローラで頻繁に使用する必要がある属性なので、パラメータ名とnullableパラメータ型(bool?、int?)を知らないので、パラメータ名と型をハードコードできません。 – alltej

+0

タイプテストでバイパスすることができます。 – Bill

関連する問題