2012-09-25 83 views
0

我使用Spring 3.1.0.RELEASE。出於某種原因,在我的控制器中,當我POST表單並在發生錯誤時返回原始屏幕時,模型屬性沒有像我通過GET方法調用頁面時那樣獲得填充。在我的控制器中我有爲什麼我的Spring模型不能使用正確的屬性填充?

@Controller 
public class StandardsUploadController { 

    … 
    @RequestMapping(value = "/upload") 
    public String getUploadForm(Model model) { 
     model.addAttribute(new StandardsUploadItem()); 
     model.addAttribute("gradeList", gradeList); 
     model.addAttribute("subjectList", subjectList); 
     return "upload/index"; 
    } 

    @RequestMapping(value = "/upload", method = RequestMethod.POST) 
    public ModelAndView processFile(final StandardsUploadItem uploadItem, 
     final BindingResult result, 
     final HttpServletRequest request, 
     final HttpServletResponse response) throws InvalidFormatException, CreateException, NamingException { 

     stdsUploadValidator.validate(uploadItem, result); 
     if (!result.hasErrors()) { 
      try { 
       …  
      } catch (IOException e) { 
       LOG.error(e.getMessage(), e); 
       e.printStackTrace(); 
      } 
     } // if 

     return new ModelAndView("upload/index"); 
    } 

我在做什麼錯,我該如何糾正它?

回答

1

當您返回從POST上傳/索引視圖,它沒有重新填充模式,因爲你的代碼來填充模型上得到完成。

一個潛在的選擇是使用@ModelAttribute標註在控制器類

你會的,例如,像這樣的StandardsUploadItem的方法:

@ModelAttribute("uploadItem") 
public StandardsUploadItem getStandardsUploadItem(){ 
    return new StandardsUploadItem(); 
} 

然後,您可以刪除從您的GET方法下面的行:

model.addAttribute(new StandardsUploadItem()); 

由於使用@ModelAttribute註釋並返回對象的方法將自動無論控制器的RequestMapping方法是否被激活,都可以放在ModelMap中。

的POST方法你的方法簽名會包含這樣的事情:

..., @ModelAttribute("uploadItem") StandardsUploadItem uploadItem, ... 

你需要做其他屬性類似的東西在你的模型(gradeList和subjectList),但是因爲你不似乎在POST上需要它們,您可以執行一些操作,例如將Model參數添加到POST方法簽名中,然後在錯誤情況下返回ModelAndView之前重新填充該Model。

相關問題