我一直在玩新的MVC3 Json模型绑定,这是相当不错的。ASP.Net MVC 3 JSON模型绑定和服务器端模型验证混合客户端验证
目前,我可以发布JSON到控制器并绑定它。模型验证也很好地发生。
但是如果模型无效会发生什么?
我想返回JSON和具有客户端通知用户(如你会如何执行正常的MVC客户端验证)
有谁知道如何执行一些这方面的教程?
这甚至可能吗?
还是有框架,我可以利用这样做?
我一直在玩新的MVC3 Json模型绑定,这是相当不错的。ASP.Net MVC 3 JSON模型绑定和服务器端模型验证混合客户端验证
目前,我可以发布JSON到控制器并绑定它。模型验证也很好地发生。
但是如果模型无效会发生什么?
我想返回JSON和具有客户端通知用户(如你会如何执行正常的MVC客户端验证)
有谁知道如何执行一些这方面的教程?
这甚至可能吗?
还是有框架,我可以利用这样做?
以下示例在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
来显示错误。但我已经从这个例子中排除了这一点。
感谢您的解决方案。通过传递字典,我改进了一点,以便您可以使用不显眼的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;
}
@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);
}
你是如何发布此JSON?你在使用AJAX吗? – 2011-01-14 15:45:49
是的,通过ajax发帖 – 2011-01-19 18:21:13
@TheCodeKing你链接回这个问题? – 2011-11-09 18:16:59