2017-07-27 28 views
3

我有一個整數輸入數組的控制器方法,它不能爲null或超過10個元素大小。驗證輸入我已經做了一個類:C#中的數組大小驗證

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

和控制器的方法:

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

根據MSDNSystem.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 atribute可以正常工作。問題出在行動過濾器。下面是代碼:

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方法驗證錯誤被忽略