У меня есть действие контроллера, которое имеет атрибут, в котором, если ModelState имеет ошибки, он устанавливает их как в методе OnResultExecuting
.Изменение фильтраContext.Result в OnResultExecuting
Я установил значение в MyAction
. Я изменяю его в атрибуте в OnResultExecuting
, но в OnResultExecuted
, который находится в контроллере, результатом является тот, который у контроллера не тот, который был установлен в атрибуте.
Так что мой вопрос в том, почему значение в OnResultExecuted
остается неизменным и как я могу прекратить это делать?
public class MyController:Controller
{
[ValidateDatedObject(SkipActionExecution = true, LeaveJustModelState = true)]
public JsonResult MyAction(ViewModel viewModel)
{
return new JsonResult { Data = new { Success = false }}; // Setting the initial value
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);//filterContext.Result here is the on from the controller instead of the one from the attribute
}
}
public class ValidateDatedObject : ModelValidationFilter
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
}//filterContext.Result here is the one from the attribute
}
public abstract class ModelValidationFilter : ActionFilterAttribute
{
private JsonResult getModelStateAsJsonResult(ModelStateDictionary modelState)
{
return new JsonResult { Data = new { modelState = SerializeErrors(modelState) } };
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.Result = getModelStateAsJsonResult(filterContext.Controller.ViewData.ModelState); //Setting filterContext.Result here
}
}
Спасибо, что работает, но проблема в том, что я сделал то же самое в 'OnActionExecuting' без проблем. Я знаю, что это другой контекст, но я считаю, что это поведение совершенно неожиданно, может быть, это только я. – trebor
Я тоже был удивлен, вот почему я закончил тем, что посмотрел на реализацию. Было бы неплохо узнать, если это по дизайну или ошибка/недосмотр –
Большое вам спасибо. Смешно, что он реализован именно так. Он должен быть реализован так, чтобы он принял окончательный объект filterCotnext.result, как и другие атрибуты фильтра. –