मुझे क्या करना है जब कोई त्रुटि होती है तो पूरे फॉर्म को प्रतिस्थापित किया जाता है। निम्नलिखित एक सुपर आदिम उदाहरण है। मैं एक फॉर्म प्रस्तुत करने के लिए टुकड़ों का एक टन उपयोग नहीं करने जा रहा हूं ... बस इसे सरल रखना।
यह एक वसंत में लिखा गया था 4.2.1 और 2.1.4 Thymeleaf
एक बुनियादी वर्ग एक उपयोगकर्ता की जानकारी प्रपत्र का प्रतिनिधित्व: UserInfo.java
package myapp.forms;
import org.hibernate.validator.constraints.Email;
import javax.validation.constraints.Size;
import lombok.Data;
@Data
public class UserInfo {
@Email
private String email;
@Size(min = 1, message = "First name cannot be blank")
private String firstName;
}
नियंत्रक: UsersAjaxController.java
import myapp.forms.UserInfo;
import myapp.services.UserServices;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.transaction.Transactional;
@Controller
@Transactional
@RequestMapping("/async/users")
public class UsersAjaxController {
@Autowired
private UserServices userServices;
@RequestMapping(value = "/saveUserInfo", method = RequestMethod.POST)
public String saveUserInfo(@Valid @ModelAttribute("userInfo") UserInfo userInfo,
BindingResult result,
Model model) {
// if any errors, re-render the user info edit form
if (result.hasErrors()) {
return "fragments/user :: info-form";
}
// let the service layer handle the saving of the validated form fields
userServices.saveUserInfo(userInfo);
return "fragments/user :: info-success";
}
}
फ़ाइल प्रपत्र और सफलता संदेश प्रस्तुत करने के लिए प्रयुक्त फ़ाइल: खंड/उपयोगकर्ता.html
<div th:fragment="info-form" xmlns:th="http://www.thymeleaf.org" th:remove="tag">
<form id="userInfo" name="userInfo" th:action="@{/async/users/saveUserInfo}" th:object="${userInfo}" method="post">
<div th:classappend="${#fields.hasErrors('firstName')}?has-error">
<label class="control-label">First Name</label>
<input th:field="*{firstName}" type="text" />
</div>
<div th:classappend="${#fields.hasErrors('first')}?has-error">
<label class="control-label">Email</label>
<input th:field="*{email}" ftype="text" />
</div>
<input type="submit" value="Save" />
</form>
</div>
<div th:fragment="info-success" xmlns:th="http://www.thymeleaf.org" th:remove="tag">
<p>Form successfully submitted</p>
</div>
जेएस कोड फॉर्म एक्शन विशेषता में दिए गए यूआरएल में फॉर्म जमा करेगा। जब प्रतिक्रिया जेएस कॉलबैक पर वापस आती है, तो किसी भी त्रुटि की जांच करें। यदि त्रुटियां हैं, तो प्रतिक्रिया के साथ फ़ॉर्म को प्रतिस्थापित करें।
(function($){
var $form = $('#userInfo');
$form.on('submit', function(e) {
e.preventDefault();
$.ajax({
url: $form.attr('action'),
type: 'post',
data: $form.serialize(),
success: function(response) {
// if the response contains any errors, replace the form
if ($(response).find('.has-error').length) {
$form.replaceWith(response);
} else {
// in this case we can actually replace the form
// with the response as well, unless we want to
// show the success message a different way
}
}
});
})
}(jQuery));
फिर, यह केवल एक मूल उदाहरण है। जैसा ऊपर बताया गया है, इस बारे में जाने का कोई सही या गलत तरीका नहीं है। यह वास्तव में मेरा पसंदीदा समाधान नहीं है, मैं निश्चित रूप से कुछ बदलाव करूँगा, लेकिन सामान्य विचार वहां है।
नोट: मेरे जेएस कोड में भी एक दोष है। यदि आप फ़ॉर्म से प्रतिक्रिया के साथ फॉर्म को प्रतिस्थापित करते हैं, तो फॉर्म हैंडलर सबमिट किया गया नया प्रतिस्थापित फॉर्म पर लागू नहीं किया जाएगा। आपको यह सुनिश्चित करने की आवश्यकता होगी कि यदि आप इस मार्ग पर जा रहे हैं, तो फॉर्म को बदलने के बाद फॉर्म हैंडलर को ठीक से पुनः आरंभ करें।
ऐसा करने का कोई सही, गलत या अनुशंसित तरीका नहीं है। यह वास्तव में इस पर निर्भर करता है कि आपका एप्लिकेशन कैसे सेटअप है, आपकी एमवीसी परतें, और आप क्या दिखाना चाहते हैं। आपके विकल्पों में अलर्ट, टुकड़े, समूहित संदेश इत्यादि शामिल हैं। मैं उपयोगकर्ता पर और किस प्रारूप में वापस लौटना चाहता हूं, इस पर निर्भर करता हूं कि मैं कई तरीकों का उपयोग करता हूं। – Aeseir
ठीक है, मैं ज्यादातर सबसे तेज़ तरीका ढूंढ रहा हूं। आरएडी और सब। तो मैं अपने बैकएंड के लिए जल्दी से एक अच्छी लग रही फ्रंटेंड का निर्माण कर सकता हूं जिसके लिए अधिक इंजीनियरिंग की आवश्यकता है। – Kristof
फिर यह वास्तव में इस बात पर निर्भर करता है कि आप कैसे सेटअप कर रहे हैं। रूपों के लिए मैं टुकड़ों का उपयोग करता हूं, इस तरह सबकुछ मानकीकृत होता है। एकवचन इनपुट/चयन के लिए मैं त्रुटियों को छुपाने/दिखाने के लिए जावास्क्रिप्ट ऑब्जेक्ट्स का उपयोग करता हूं। – Aeseir