2016-07-12 3 views
0
class RequiredOptionalId 
{ 
    public int Id { get; set; } 
} 

私はモデルであるRequiredOptionalIdクラスのこのプロパティを持っています。私は2つのコントローラからこれにアクセスします。クラスのプロパティをコントローラに応じて必須とオプションの両方にするデータアノテーションはありますか?

class RequiredIdController : ApiController 
    { 
    public IHttpActionResult Post([FromBody]RequiredOptionalId requiredOptionalId) 
    { 
        if (!ModelState.IsValid) 
        { 
         return BadRequest(); 
        } 
    } 
    } 

    class OptionalIdController : ApiController 
    { 
    public IHttpActionResult Post([FromBody]RequiredOptionalId requiredOptionalId) 
    { 
        if (!ModelState.IsValid) 
        { 
         return BadRequest(); 
        } 
    } 
    } 

データアノテーションを使用します。フィールドは、このコントローラのために真実ではないとする必要作られて私は

class RequiredOptionalId 
    { 
     [Required,Range(1, int.MaxValue)] 
     public int Id { get; set; } 
    } 

をapply-とき、これは「OptionalIdController」のPOSTメソッドで問題を作成します。

私はこのanntoationすなわち

class RequiredOptionalId 
     { 
      public int Id { get; set; } 
     } 

Idフィールドには検証がないのでこれが「RequiredIdController」の問題を作成するを削除した場合。

"RequiredIdController"ポストメソッドのコントローラーにこれを追加できますが、そのようにしたくありません。

これを達成するためにこれらの注釈や一部のフィルタを使用できる他の方法はありますか?

答えて

1

ActionFilterと書いて、必要なパラメータを渡すことができます。 .Net Coreを使用した例。

あなたの行動:

[Route("api/[controller]")] 
public class ValuesController : Controller 
{ 
    // GET api/values 
    [HttpGet] 
    [RequiredParameters("category","name")] 
    public IActionResult Get(Request request) 
    { 
     if(ModelState.IsValid) 
      return Json(request); 

     return BadRequest(ModelState); 
    } 
} 

あなたの属性:

public class RequiredParametersAttribute : ActionFilterAttribute 
{ 
    private string[] requiredProperties; 

    public RequiredParametersAttribute(params string[] props) 
    { 
     requiredProperties = props; 
    } 

    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     foreach (var property in requiredProperties) 
     { 
      //NOTE: assumption that action has only one parameter and looking only at first children in the object tree 
      object obj = context.ActionArguments.FirstOrDefault().Value; 
      if (obj?.GetType().GetProperty(property).GetValue(obj) == null || obj.GetType().GetProperty(property).GetValue(obj).Equals(GetDefaultValue(obj.GetType().GetProperty(property).PropertyType))) 
       context.ModelState.TryAddModelError(property, property +" is required."); 
     } 
    } 

    public static object GetDefaultValue(Type type) 
    { 
     return type.GetTypeInfo().IsPrimitive ? Activator.CreateInstance(type) : null; 
    } 
} 

あなたの要求クラス:

public class Request 
{ 
    public int category { get; set; } 
    public string name { get; set; } 
} 

要求:/api/values?name=test{"category":["category is required."]}を返します。

関連する問題