Я создал фильтр, который будет использоваться из действий, которые получают Модели в качестве параметров. Идея состоит в том, чтобы вернуть 400 до того, как запрос поступит непосредственно в действие.WebApi - Доступ и проверка моделей в фильтрах
Вот фильтр:
public class ValidateModelAttribute : ActionFilterAttribute
{
private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnActionExecuting(HttpActionContext actionContext)
{
Log.Debug("");
var _return = new BaseReturn<object>();
_return.Success = false;
try
{
if (actionContext.ModelState.IsValid && actionContext.ActionArguments[actionContext.ActionArguments.Keys.First()] != null)
return;
if (actionContext.ModelState.Values.Count == 0)
_return.Message = "Model not sent";
if (actionContext.ModelState.Values.Count > 0 && actionContext.ModelState.Values.Any(c => c.Errors.Count > 0))
_return.Message = actionContext.ModelState.Values.First(c => c.Errors.Count > 0).Errors[0].ErrorMessage;
}
catch (Exception ex)
{
_return.Message = ex.Message;
}
if (_return.Message == null)
_return.Message = "Model is not valid";
actionContext.Response = actionContext.Request.CreateResponse<BaseReturn<object>>(HttpStatusCode.BadRequest, _return);
}
}
И это мое действие:
[HttpPost]
[Route("api/Devices/{id}/SendOrder")]
[ValidateModel]
public BaseReturn<bool> SendNotificationToDevice(string id, OrderNotification model)
{
}
Проблема здесь заключается в том, что ModelState только пытается проверить {ID} параметра. Это делает проверяет мою модель, если я удалю {id} из объявления метода.
Есть ли способ заставить ModelState проверить оба параметра?
Хорошо ... кажется, что ModelState делает проверяет модель даже на {id} в объявлении метода. Единственная проблема заключается в том, что я не смог найти способ обнаружить (в методе OnActionExecuting), если была отправлена модель OrderNotification или нет.
Когда я отправляю пустой JSON, ModelState.Values.Count равен 1, и поскольку в URL-адресе присутствует {id}, ModelState.IsValid является true.