MVC + Достаточно ли атрибутов проверки? - PullRequest
0 голосов
/ 14 января 2011

Мой ViewModel имеет атрибуты проверки, которые гарантируют, что он не будет пустым и т. Д. - Достаточно ли этого или я должен позволить моим контрактам кода, которые я заключил, быть в ActionResult?

Пример:

// CreateCaseViewModel.cs

public class CreateCaseViewModel
{
    [Required]
    public string Topic { get; set; }

    [Required]
    public string Message { get; set; }
}

// CaseController.cs

[AuthWhere(AuthorizeRole.Developer)]
[HttpPost]
public ActionResult Create(CreateCaseViewModel model)
{
    if(!ModelState.IsValid)
    {
        // TODO: some cool stuff?
    }

    if (string.IsNullOrWhiteSpace(model.Message))
    {
        throw new ArgumentException("Message cannot be null or empty", model.Message);
    }

    if (string.IsNullOrWhiteSpace(model.Topic))
    {
        throw new ArgumentException("Topic cannot be null or empty", model.Topic);
    }

    var success = false;
    string message;

    var userId = new Guid(_membershipService.GetUserByUserName(User.Identity.Name).ProviderUserKey.ToString());

    if(userId == Guid.Empty)
    {
        throw new ArgumentException("UserId cannot be empty");
    }

    Case createCase = _caseService.CreateCase(model.Topic, model.Message);

    if(createCase == null)
    {
        throw new ArgumentException("Case cannot be null");
    }

    if(_caseService.AddCase(createCase, userId))
    {
        message = ControllerResources.CaseCreateFail;
    }
    else
    {
        success = true;
        message = ControllerResources.CaseCreateSuccess;
    }

    return Json(new
    {
        Success = success,
        Message = message,
        Partial = RenderPartialViewToString(ListView, GetCases)
    });
}

1 Ответ

1 голос
/ 14 января 2011

Ваш код не имеет большого смысла для меня.

  • throw new ArgumentException вернет ошибку 500 (ошибка сервера). Вам лучше следовать принципам REST и отправить соответствующий код ошибки (например, 402 неверный запрос с соответствующим описанием ошибки) или вернуть JSON с success = false и соответствующим сообщением об ошибке.

  • Ваш код, кажется, следует, даже если Модель недействительна. Форк должен включать, если он действителен -> сохранить, в противном случае отправлять ошибки клиенту.

  • Похоже, вы не используете сообщения об ошибках модели. Они полезны, и вы можете найти их в ModelState.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...