2009-05-21 77 views
2

我一直在寻找许多ASP.Net MVC客户端验证的想法,包括xVal。目前这还没有提供ValidationSummary,因此我选择了AJAX帖子,它通过ModelState错误循环,并在成功的AJAX帖子上用错误消息更新DIV。AJAX验证的想法 - 完成ValidationSummary&ValidationMessage

问题在于您的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" /> 

回答

1

在我目前的ASP.NET MVC项目,我有很多,我使用AJAX和整个验证问题跑太POST行为。我所做的就是创建一个会从这些行动看起来像这样的返回的包装对象...

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的onSuccess POST代码,我检查错误,并采取任何必要的行动,像这样...(注意,在代码中,从服务器返回的对象已经被jQuery反序列化为JS对象)

function onSuccess(jsonWrapper) { 
    if (!jsonWrapper.IsError) { 
     var myDataFromAction = jsonWrapper.Data; 
     //Do stuff with my data 
    } 
    else { 
     MessageBox.ShowMessage(jsonWrapper.Message); 
    } 
} 

这不适合开箱即用的场景,但您可以做一些类似概念的事情。希望这至少能给你一些想法。

+0

如果没有错误什么是MessageBox.ShowMessage - 是不是Windows窗体?如果服务器端没有错误,我假设你继续进行Controller操作并将数据添加到数据库中?有错误时你只返回JSON吗?虽然看起来很好! – Jon 2009-05-21 14:01:09