2011-01-13 8 views
0

내 ViewModel에 비어 있지 않은지 확인하는 유효성 검사 속성이 있습니다. - 충분합니까? 아니면 내가 작성한 코드 계약도 ActionResult에 포함시켜야합니까?MVC + 유효성 검사 속성이 충분합니까?

예 :

// 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

귀하의 코드는 나에게 많은 이해가되지 않습니다.

  • throw new ArgumentException은 오류 500 (서버 오류)을 반환합니다. REST 원칙을 따르고 적절한 오류 코드 (예 : 오류에 대한 적절한 설명이있는 402 나쁜 요청)를 보내거나 success = false 및 적절한 오류 메시지로 JSON을 반환해야합니다.

  • 모델이 유효하지 않은 경우에도 코드가 따르는 것으로 보입니다. Fork은 valid -> save를 포함해야하며, 그렇지 않으면 클라이언트에 오류를 보냅니다.

  • 모델 오류 메시지를 사용하지 않는 것 같습니다. 그들은 유용하며 ModelState에서 찾을 수 있습니다.

당신은 당신이 좋은 코드를 가지고 있다고 생각합니다.

+0

아, 고마워요! 하지만 내 viewmodel의 유효성 검사 속성이 동일하더라도 여전히 ActionResult에 if 문을 codecontract해야한다고 생각합니까? – ebb