2011-01-14 98 views
20

我一直在玩新的MVC3 Json模型绑定,这是相当不错的。ASP.Net MVC 3 JSON模型绑定和服务器端模型验证混合客户端验证

目前,我可以发布JSON到控制器并绑定它。模型验证也很好地发生。

但是如果模型无效会发生什么?

我想返回JSON和具有客户端通知用户(如你会如何执行正常的MVC客户端验证)

有谁知道如何执行一些这方面的教程?

这甚至可能吗?

还是有框架,我可以利用这样做?

+0

你是如何发布此JSON?你在使用AJAX吗? – 2011-01-14 15:45:49

+0

是的,通过ajax发帖 – 2011-01-19 18:21:13

+0

@TheCodeKing你链接回这个问题? – 2011-11-09 18:16:59

回答

25

以下示例在MVC3中使用不显眼的JavaScript时适用于我。我正在做一些非常相似的事情。鉴于以下JsonResponse类:

public enum Status 
{ 
    Ok, 
    Error 
} 

public class JsonResponse 
{ 
    public Status Status { get; set; } 
    public string Message { get; set; } 
    public List<string> Errors { get; set; } 
} 

我的控制器可以有这样的方法:

[HttpPost] 
public ActionResult Login(UserLoginModel model) 
{ 
    JsonResponse res = new JsonResponse(); 

    if (!ModelState.IsValid) 
    { 
     res.Status = Status.Error; 
     res.Errors = GetModelStateErrorsAsString(this.ModelState); 
     res.Message = "Oh dear, what have you done. Check the list of errors dude!"; 
    } 
    else 
    { 
     // Save it here... 

     // Return success 
     res.Status = Status.Ok; 
     res.Message = "Everything was hunky dory"; 
    }    

    return Json(res); 
} 

而且ModelStateDictionary可以列举的错误,所以:在

private List<string> GetModelStateErrorsAsString(ModelStateDictionary state) 
{ 
    List<string> errors = new List<string>(); 

    foreach (var key in ModelState.Keys) 
    { 
     var error = ModelState[key].Errors.FirstOrDefault(); 
     if (error != null) 
     { 
      errors.Add(error.ErrorMessage); 
     } 
    } 

    return errors; 
} 

然后我查看我可以有以下JSON POST:

<script type="text/javascript"> 
$("form").submit(function (evt) { 
    // validate 
    $('form').valid(); 

    // extract values to submit   
    var form = $(this), 
     username = form.find("[name=Username]").val(), 
     password = form.find("[name=Password]").val(), 
     json = JSON.stringify({ 
      Username: username, 
      Password: password 
     }); 

    $.ajax({ 
     url: form.attr("action"), 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: json, 
     success: function (result) { 
      alert(result.Message); 
     } 
    }); 

    // stop form submitting 
    evt.preventDefault(); 
}); 
</script> 

我正在使用jQuery.tmpl来显示错误。但我已经从这个例子中排除了这一点。

1

感谢您的解决方案。通过传递字典,我改进了一点,以便您可以使用不显眼的JavaScript将验证放在单个字段上,而不是通过引用字典的键来进行总结。

private Dictionary<string, string> GetModelStateErrorsAsString(ModelStateDictionary state) 
    { 
     Dictionary<string, string> errors = new Dictionary<string, string>(); 
     foreach (var key in ModelState.Keys) 
     { 
      var error = ModelState[key].Errors.FirstOrDefault(); 
      if (error != null) 
      { 
       errors.Add(key, error.ErrorMessage); 
      } 
     } 
     return errors; 
    } 
0

@Junto和@ Jamey777,你既传递的ModelState到你的错误的功能,但那么你使用全局变量而不是参数。

和你为什么不只是使用一个小LINQ像

private Dictionary<string, string> GetModelStateErrorsAsString() 
    { 
     return ModelState.Where(x=> x.Value.Errors.Any()) 
      .ToDictionary(x => x.Key, x => x.Value.Errors.First().ErrorMessage); 
    }