повторить логику информации об общей ошибке в ActionFilterAttribute - PullRequest
3 голосов
/ 24 июня 2010

Я реализую веб-API с использованием инфраструктуры REST для ASP.NET MVC (MVC 2).Я хочу инкапсулировать этот код, в идеале в ActionFilterAttribute (?), Чтобы я мог украсить определенные действия, которые всегда выполняют ту же логику:

if (!ModelState.IsValid) {
  return View(
    new GenericResultModel(){ HasError=True, ErrorMessage="Model is invalid."});
}

Я действительно не хочу копировать и вставлятьэтот шаблонный код в каждое действие контроллера, где мне нужно это сделать.

В этом сценарии веб-API мне нужно иметь возможность сделать что-то подобное, чтобы вызывающий мог получить результат обратно в форме JSON или POXи вижу, что есть ошибка.В представлении ASPX, очевидно, мне не понадобится что-то подобное, так как элементы управления проверкой позаботятся об уведомлении пользователя о проблеме.Но у меня нет представления ASPX - я возвращаю только данные JSON или POX, сериализованные из моей модели.

Я начал с этим кодом в ActionFilter, но не уверен, что делать дальше (или еслиэто даже правильная отправная точка):

public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        bool result = filterContext.Controller.ViewData.ModelState.IsValid;
        if (!result)
        {
            GenericResultModel m = new GenericResultModel() { HasError = true };
            // return View(m)
            // ?????
        }

        base.OnActionExecuting(filterContext);
    }     

Как мне это сделать?

1 Ответ

4 голосов
/ 24 июня 2010
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    // Notice that the controller action hasn't been called yet, so
    // don't expect ModelState.IsValid=false here if you have 
    // ModelState.AddModelError inside your controller action
    // (you shouldn't be doing validation in your controller action anyway)
    bool result = filterContext.Controller.ViewData.ModelState.IsValid;
    if (!result)
    {
        // the model that resulted from model binding is not valid 
        // => prepare a ViewResult using the model to return
        var result = new ViewResult();
        result.ViewData.Model = new GenericResultModel() { HasError = true };
        filterContext.Result = result;
    }
    else
    {
        // call the action method only if the model is valid after binding
        base.OnActionExecuting(filterContext);
    }
}
...