2017-04-19 169 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 –

相关问题