我一直在研究许多ASP.Net MVC客户端验证思路,包括xVal。目前这还没有提供ValidationSummary所以我选择做一个AJAX帖子,它循环传递ModelState错误并在成功的AJAX帖子上用错误消息更新DIV。
问题是这些字段旁边的ValidationMessage *不会被填充。我想出了另一个我尚未测试过的想法,因为我不知道完整的语法让它工作但我想我会看到你们的想法。
我认为可能存在的一个问题是当你在控制器中发布你的编辑/创建动作方法而你想要返回一个JSON对象时,我不确定这是合法的,因为JSON用于GET动作仅
如果您认为这是一个好主意并希望提供帮助,请留下答案和任何代码片段以使其正常工作。如果你认为它是一个头发脑力计划,可以做得更好,请让我知道如何。
控制器:
if (!ModelState.IsValid)
{
var err = ModelState.Where(f => f.Value.Errors.Count > 0);
if (Request.IsAjaxRequest())
{
return this.Json(err);
}
else
{
return View(PostedItem);
}
}
查看:
$(function() {
$('#createForm').ajaxForm({
success:fillSummary
});
//click events
$('#btnSave').click( function(){
$('#createForm').submit();
});
function fillSummary(data)
{
//Loop through the modelstate errors returned
$.each(data)
{
//Append Summary DIV with error message
//Look for span with the ModelState key name and set it to visible
}
}
<div id="summary">
<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.")%>
</div>
<form action="<%=Url.Action("Create") %>" method="post" id="createForm">
<fieldset>
<div>
<label for="Title">Title:</label>
<%= Html.TextBox("Title",Model.Title) %>
<%= Html.ValidationMessage("Title", "*") %>
<span id="val_Title" style="display:none">*</span>
</div>
</form>
<input type="button" value="Save" id="btnSave" />
答案 0 :(得分:1)
在我目前的ASP.NET MVC项目中,我有很多POST操作,我用于AJAX并且也遇到了验证问题。我所做的是创建一个包装器对象,从这些看起来像这样的动作返回...
public class JsonWrapper
{
public object Data { get; set; }
public bool IsError { get; set; }
public string Message { get; set; }
}
如果操作中的验证没有任何类型的错误,我会在Data属性中放置我想要返回的任何数据。但是,如果存在任何类型的验证错误或其他异常,我将IsError标志设置为true并在Message属性中设置错误消息。然后在操作结束时,我将对象序列化为JSON并返回它(是的,你可以通过POST操作执行此操作)...
return Json(myJsonWrapper);
从客户端,在我的AJAX POST代码的onSuccess中,我检查错误,并采取任何必要的操作...(注意,在代码的这一点,从服务器返回的对象已经被jQuery反序列化为JS对象
function onSuccess(jsonWrapper) {
if (!jsonWrapper.IsError) {
var myDataFromAction = jsonWrapper.Data;
//Do stuff with my data
}
else {
MessageBox.ShowMessage(jsonWrapper.Message);
}
}
这不适合您的场景开箱即用,但您可以做一些与概念类似的事情。希望这至少能给你一些想法。