我正在使用 The play framework 2.1.3 并且有一个关于使用 jquery 和 ajax 进行表单验证的问题。我已按照这篇文章 ( http://franzgranlund.wordpress.com/2012/03/29/play-framework-2-0-javascriptrouter-in-java/ ) 中的建议设置 JavaScript 路由并且该部分正在工作伟大的!我需要第二部分的帮助,返回一个包含错误消息的渲染表单并将其显示在我的页面上。我创建了以下示例来说明我的问题。
路由文件如下所示:
# AJAX calls
POST /validateForm controllers.Application.validateForm()
# JavaScript Routing
GET /assets/javascripts/routes controllers.Application.javascriptRoutes()
应用程序控制器如下所示:
private static Form<User> form = Form.form(User.class);
public static Result validateForm() {
Form<User> boundForm = form.bindFromRequest();
if (boundForm.hasErrors()) {
return badRequest(user_form.render(boundForm));
} else {
return ok();
}
}
public static Result javascriptRoutes() {
response().setContentType("text/javascript");
return ok(Routes.javascriptRouter("jsRoutes", controllers.routes.javascript.Application.validateForm()
));
}
在没有太技术性的情况下,我使用 Twitter Bootstrap 来呈现我的表单,因此我创建了以下视图元素(有关更多信息表单验证和表单助手,请参阅这篇文章),它由 validateForm 操作呈现并将其返回给调用 jquery。阿贾克斯()。
@(userForm: Form[User])
@import helper._
@implicitFieldConstructor = @{ FieldConstructor(twitterBootstrapInput.f) }
@form(routes.Application.createUser(), 'id -> "createUserForm") {
<fieldset>
<legend>New User</legend>
@inputText(userForm("name"), 'class -> "form-control", 'placeholder -> "First Name")
@inputText(userForm("surname"), 'class -> "form-control", 'placeholder -> "Last Name")
<button id="createUserBtn" type="button" class="btn">Create User</button>
</fieldset>
}
我正在使用 jquery,我的 javascript 文件如下所示。就本问题而言,假设验证失败并返回 badRequest。
$("#createUserBtn").click(function() {
jsRoutes.controllers.Application.validateForm().ajax({
type: "POST",
data: $("#createUserForm").serialize(),
success: function(response) {
// something here
},
error: function(response) {
$("#createUserForm").html(response);
}
});
});
无需过多介绍视图,我在视图中正确地包含了 JavaScript 文件,并且有一个名为 #createUserForm 的元素。
客户端和服务器端之间的通信似乎工作得很好,但是,我无法通过 .html(response) 将响应中包含的渲染视图元素加载到页面上。那么,如何做到这一点呢?我哪里出错了?我对这些概念中的许多概念都很陌生,并希望能提供任何有用的意见。谢谢。
更新:
两项更改将允许此代码完美地工作。(1) 由于我们要替换整个表单,包括按钮,我们需要利用jQuerys .on() 来处理按钮点击事件。(2) 调用 responseText 属性将正确返回结果中包含的 html。
$(document).on("click", "#createUserBtn", function() {
jsRoutes.controllers.Application.validateForm().ajax({
type: "POST",
data: $("#createUserForm").serialize(),
success: function(response) {
// something here
},
error: function(response) {
$("#createUserForm").html(response.responseText);
}
});
});
任何意见?你会如何做得更好?