2011-01-13 76 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错误的请求和适当的错误描述),或者返回您的JSON,其中包含success = false和相应的错误消息。

  • 即使Model无效,您的代码似乎仍然存在。叉必须包含有效 - >保存,否则将错误发送给客户端。

  • 您似乎没有使用模型错误消息。它们很有用,你可以在ModelState找到它们。

你解决了这些问题,我认为你有一个很好的代码。

+0

啊,感谢您的建议!但是你认为我仍然应该在ActionResult中使用我的codecontract if语句,尽管我的viewmodel中的验证属性是一样的吗? – ebb 2011-01-13 23:05:57