0

我在练习阿贾克斯!我有一个简单的联系表格,这是我的行动:

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>

现在我想向用户展示联系成功或失败,我的代码不起作用的问题是什么?有趣的是,我的验证在这种情况下不起作用!请帮我解决这个问题,谢谢

4

2 回答 2

1

如果您想发送错误响应,则应将 Response 对象的 ResponseCode 设置为合适的 http 错误代码,例如 400 表示错误请求。

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

于 2013-04-08T13:53:49.723 回答
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/等),您可能想要做一些不同的事情

于 2013-04-08T13:59:15.257 回答