2013-04-08 37 views
0

我正在练习Ajax!我有一个简单的联系表,这是我的操作:json MVC中的成功和失败响应

public ActionResult Contact() 
     { 
      return View("Contact"); 
     } 

     [HttpPost] 
     public ActionResult Contact(ContactViewModel contactViewModel) 
     { 
      if (ModelState.IsValid) 
      { 
       var contact = contactViewModel.ConvertToContactModel(); 
       _contactRepository.Add(contact); 
       _contactRepository.Save(); 
       return Json(new { msg = "Your contact Sent, I'll response soon." }); 
      } 
      return Json("Sorry! Somthing went wrong, try again or contact again"); 
     } 

,这是我的看法:

@model Blog.Web.UI.ViewModels.ContactViewModel 
@{ 
    ViewBag.Title = "Contact"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<div id="Contact"> 
    @using (Ajax.BeginForm("Contact", "Home", new AjaxOptions() { OnSuccess = "Success" })) 
    { 

     <div> 
      @Html.LabelFor(c => c.Name) 
      @Html.TextBoxFor(c => c.Name) 
     </div> 

     <div> 
      @Html.LabelFor(c => c.Email) 
      @Html.TextBoxFor(c => c.Email) 
      @Html.ValidationMessageFor(c => c.Email) 
     </div> 

     <div> 
      @Html.LabelFor(c => c.Subject) 
      @Html.TextBoxFor(c => c.Subject) 
     </div> 

     <div> 
      @Html.LabelFor(c => c.Body) 
      @Html.TextAreaFor(c => c.Body) 
      @Html.ValidationMessageFor(c => c.Body) 
     </div> 
     <input type="submit" value="Send" /> 
    } 
</div> 

<script type="text/javascript"> 
    function Success(context) { 
     if (context[0]) { 
      $("#Contact").empty().html(context[1]); 
     } 
    } 
</script> 

现在我想向用户显示成功或取得接触的失败,是什么问题我的代码不起作用? 它是如此有趣,我的验证不起作用在这种情况下! 请帮我一下,谢谢

回答

0

与Slicksim相反,我们通常有一个JSON返回类定义在我们的包含布尔变量Success的应用程序模型。然后,我们可以使用它来让Javascript确定请求是否成功。

public class JsonResponseModel(){ 
    public bool Success {get;set;} 

    public string Message {get;set;} 
} 

public ActionResult Contact() 
     { 
      return View("Contact"); 
     } 

     [HttpPost] 
     public ActionResult Contact(ContactViewModel contactViewModel) 
     { 
      if (ModelState.IsValid) 
      { 
       var contact = contactViewModel.ConvertToContactModel(); 
       _contactRepository.Add(contact); 
       _contactRepository.Save(); 
       return Json(new JsonResponseModel{ Success = true, Messsage = "Your contact Sent, I'll response soon." }); 
      } 
      return Json(new JsonResponseModel{Success = false, Message = "Sorry! Somthing went wrong, try again or contact again"}); 
     } 

<script type="text/javascript"> 
    function Success(response) { 
     if (response.Success) { 
      $("#Contact").empty().html(response.Message); 
     } 
     else{ 
      alert(response.Message); 
     } 
    } 
</script> 

我想这是我们去修改服务器头,而不是因为你可能需要做一些不同的,如果验证在AJAX调用,而不是实际的服务器错误(HTTP状态代码500失败的路线/ 404/etc)

0

如果你想要发送错误响应,那么你应该设置Response对象的ResponseCode为一个合适的http错误代码,比如400请求错误。

然后,您需要在ajax.beginform中提供一个错误处理程序来显示您想要的内容。如果你不这样做,它将返回一个响应代码200,这就是说,一切都是hunky dory,所以你的错误处理程序将不会被触发