2017-07-27 13 views
3

私は整数型の配列を持つコントローラメソッドを持っていますが、これはnullでも10個以上の要素サイズであってはいけません。C#の配列サイズのバリデーション

public class TestForm 
{ 
    [Required] 
    [MaxLength(10)] 
    public long[] feedIds { get; set; } 
} 

とコントローラ方法::私が作ったクラス」VEの入力を検証するために

[HttpPost] 
public async Task<IActionResult> DoSomeJob(TestForm form) 
{ 
    //Do some job 
} 

よるMSDNに、System.ComponentModel.DataAnnotations.MaxLengthは、配列のために使用することができますが、ない検証はありません、それはヌルと配列を取得します任意のサイズの私は間違って何をしていますか?ここで

+0

'MaxLength'は確かにそれが唯一の指定された正確な長さである値を可能にする(唯一、私は思う)EntityFramework –

答えて

5

は、我々のプロジェクトの一つに使用するものである:以下のような性質に

public class LengthAttribute : ValidationAttribute { 
    readonly int length; 

    public LengthAttribute(int length) { 
     this.length = length; 
    } 

    public override bool IsValid(object value) { 
     if (value is ICollection == false) { return false; } 
     return ((ICollection)value).Count == length; 
    } 
} 

public class CreateUserApiRequest : ApiRequest { 

    [DataMember] 
    [Length(128)] 
    [Description("クライアントキー")] 
    public byte[] clientKey { get; set; } 
    .... 
+0

に使用されています。 (私はちょうどあなたのプロジェクトにバグを見つけましたか?:D)OPが何であるかは考えていません。その素晴らしい解決策以外は、彼の質問に適用することができます。 – Skintkingle

+1

正確に128の長さが必要です。私はOPがOPが望むものを得るためにコードを '=='から '<='に簡単に変更できるという説明は必要ないと思います。 –

-1

あなたの財産feedIdsは、あなたの財産を拡張し、配列しなければならない場合いくつかの検証を行うには、以下のようにしてください。

public class TestForm 
{ 
    private long[] _feedIds; 


    public long[] feedIds 
    { 
     get 
     { 
      if (_feedIds == null) _feedIds = new long[0]; 

      return _feedIds; 
     } 
     set 
     { 
      if (value == null) throw new ArgumentNullException(nameof(value)); 
      if (value.Length > 10) throw new ArgumentOutOfRangeException(nameof(value), "Max length of array is 10."); 

      _feedIds = value; 
     } 
    } 
} 

Koda

+1

プロパティを設定するときの例外のスロー*は、属性によるMVCの検証とModelState *の設定と全く同じではありません。 –

0

MaxLengthの属性は正常に動作します。問題はアクションフィルターにあった。ここでは、コードです:

services.AddMvc(options => 
     { 
      options.Filters.Add(new MyValidationFilterAttribute()); 
      //Some other code 
     } 

public class MyValidationFilterAttribute: IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext context) 
    { 
    } 

    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (context.ModelState.IsValid) 
      return; 

     if (!RequestRecognizingUtils.IsMobileAppRequest(context.HttpContext.Request)) 
      return; //Here all validation results are ignored 
    } 
} 

OnActionExecutingメソッドの検証エラーで無視された

関連する問題