2017-04-19 168 views
0

我試圖在beego中提交表單數據並將其存儲到數據庫中。並有一些問題:在beego中處理表單提交的正確方法是什麼?

  • 如何正確處理請求並將其轉換爲對象?
  • 我應該驗證請求還是轉換對象?

我的控制器動作:

func (c *ServicesController) Edit() { 
    var err error 
    var id, _ = c.GetUint64(":id") 
    var serviceModel = models.Service{} 
    var service models.Service 

    service, err = serviceModel.FindById(id) 

    c.Data["Service"] = service 

    if err == orm.ErrNoRows || err == orm.ErrMissPK { 
     c.Abort("404") 
    } 

    if c.Ctx.Input.IsPost() { 
     err = nil 
     if err := c.ParseForm(&service); err != nil { 
      c.Abort("500") 
     } 

     serviceModel.CreateOrUpdate(service) 
    } 

    c.TplName = "services/edit.html" 
} 

型號:

type Service struct { 
    Id  uint64 `form:"-"` 
    Name  string `orm:"size(100)" valid:"Required; MaxSize(100)" form:"name"` 
} 

func init() { 
    orm.RegisterModel(new(Service)) 
} 

func (s *Service) FindById(id uint64) (Service, error) { 
    o := orm.NewOrm() 
    service := Service{Id: id} 
    err := o.Read(&service) 

    return service, err 
} 

func (s *Service) CreateOrUpdate(service Service) { 
    o := orm.NewOrm() 
    o.InsertOrUpdate(&service) 
} 

但是,當我試圖提交表單(與InsertOrUpdate)也無妨創建新的對象,因爲我沒有id字段在窗體中(因爲我從路由ID參數中檢索對象)。我是否應該通過id來形成或如何破解它?

回答

1

您解析表單後,只需添加ID:

if err := c.ParseForm(&service); err != nil { 
    c.Abort("500") 
} 
service.Id = id 

通過beego的來源來看,我認爲你可以這樣做:

if c.Ctx.Input.IsPost() { 
    c.Input().Add("id", id) 
    err = nil 
    if err := c.ParseForm(&service); err != nil { 
     c.Abort("500") 
    } 

    serviceModel.CreateOrUpdate(service) 
} 

但如果沒有,我只想調整你代碼有點:

func (c *ServicesController) Edit() { 
    var id, _ = c.GetUint64(":id") 
    var service models.Service{} 
    var serviceModel = models.Service{} 
    var err error 

    if c.Ctx.Input.IsPost() { 
     if err = c.ParseForm(&service); err != nil { 
      c.Abort("500") 
     } 
     service.Id = id 
     serviceModel.CreateOrUpdate(service) 
    } else { 
     service, err = serviceModel.FindById(id) 
     if err == orm.ErrNoRows || err == orm.ErrMissPK { 
     c.Abort("404") 
    } 

    c.Data["Service"] = service 
    c.TplName = "services/edit.html" 
} 
+0

我也想一想,但它不醜嗎?我從數據庫中獲取對象並將表單數據應用到它。爲什麼它會覆蓋不在表單中的ID? –

+0

你不得不向我們展示你的'ParseForm'方法,我不知道它爲什麼會覆蓋它的方法 – dave

+0

這不是我的,它來自beego –

相關問題